内存管理-31-每进程内存统计-6-/proc/pid/smaps_rollup
一、smaps_rollup 简介
基于 Linux-6.1
可用于评估单个进程内存占用,cat打印如下:
# cat /proc/4489/smaps_rollup 02000000-7fde8b8000 ---p 00000000 00:00 0 [rollup] Rss: 2259516 kB Pss: 2073919 kB Pss_Dirty: 1188678 kB Pss_Anon: 980293 kB Pss_File: 1092452 kB Pss_Shmem: 1172 kB Shared_Clean: 138760 kB Shared_Dirty: 60676 kB Private_Clean: 872892 kB Private_Dirty: 1187188 kB Referenced: 2026788 kB Anonymous: 1014640 kB LazyFree: 360 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB FilePmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 2272 kB SwapPss: 16 kB Locked: 0 kB
smaps_rollup 是对进程所有 VMA 走一遍得到的汇总(第一行 [rollup] 只是占位头,---p / 0 / 00:00 / 0 都不是真实属性,task_mmu.c:1016-1021)。所有字段都是同一批页在三个维度上的投影:
1. Rss
全量,页表里真实驻留的页;包含共享页的完整大小。
Rss = Shared_Clean + Shared_Dirty + Private_Clean + Private_Dirty(task_mmu.c:475, 428-455) = 138760 + 60676 + 872892 + 1187188 = 2259516 //一致
2. Pss:
份额,私有页全量 + 共享页 ÷ mapcount,估算“本进程应分摊多少物理内存”(:495-507)
3. Pss_Dirty
份额, Pss 中脏页那部分:私有脏页 + 共享脏页/mapcount(:444-445)
4. Pss_Anon
份额,Pss 中的匿名页(PageAnon)(:434-435)
5. Pss_File
份额,Pss 中的普通文件页(:438-439)
6. Pss_Shmem
份额,Pss 中的 shmem/tmpfs/ashmem/memfd(PageSwapBacked 且非 PageAnon)(:436-437)
7. Shared_Clean
全量,mapcount≥2 且干净的页,不除 mapcount。
8. Shared_Dirty
全量,mapcount≥2 且被改过的页。
9. Private_Clean
全量,当前只有本进程映射(mapcount<2)且干净。
10. Private_Dirty
全量,只有本进程映射且被改过——最硬的内存。
11. Referenced
全量,自上次老化以来访问位被置过的页(:477-478),不是“活跃内存”精确值。
12. Anonymous
全量,驻留匿名页(PageAnon),不含 shmem(:469-470);共享匿名页每进程都全量计。
13. LazyFree
全量,MADV_FREE 标记、尚未写、仍驻留的匿名页(:471-472);可无回写丢弃;是 Anonymous 子集。
14. AnonHugePages
全量,匿名 THP(2MB 粒度),与 Pss/Rss 重叠,不是额外内存(:608-609)
15. ShmemPmdMapped
全量被 PMD 级映射的 shmem 大页(:610-615)
16. FilePmdMapped
全量被 PMD 级映射的文件大页(:610-615)
17. Shared_Hugetlb
全量,hugetlbfs 大页的共享部分(:743-764)
18. Private_Hugetlb
全量,hugetlbfs 大页的私有部分(:743-764)
19. Swap
全量,页表里 swap 条目总量(含 shmem 空洞),共享 swap 条目也全量计(:550-568)
20. SwapPss
份额,swap 条目的按份额版本(:556-565)
21. Locked
份额,VM_LOCKED(mlock)页的 PSS,不是全量字节(:441-442, 875-876)
二、相关补充
1. Private/Shared 是按“当前 mapcount”分的,不是 MAP_PRIVATE/MAP_SHARED 属性。一个 MAP_SHARED 页只有本进程映射,也会算成 Private。
2. Pss_Anon/File/Shmem 只在 rollup 里有意义;普通 smaps 的每个 VMA 里通常两个是 0、一个是 Pss(task_mmu.c:847-857 注释)。
3. Rss 跨进程求和会重复,全系统汇总要用 Pss;Pss 是估算:mapcount 在扫描时取快照,进程不断 map/unmap 就会变;smaps_rollup 不是原子快照:遍历中可能临时释放并重取 mmap_lock(task_mmu.c:951-1012);THP/Hugetlb 字段与 Rss/Pss 重叠,不要另加;
4. 看泄漏盯 Pss_Anon 和 Private_Dirty 的趋势,比看 Rss 更可靠。
posted on 2026-11-02 15:11 Hello-World3 阅读(1) 评论(0) 收藏 举报
浙公网安备 33010602011771号