内存管理-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)    收藏  举报

导航