据我所知有几个内存概念:VSS RSS PSS和USS,其中USS(唯一集大小)是进程专用的物理内存(如果需要请纠正我)。
我认为这应该是一个非常有用的值,让我知道哪个进程使用了太多物理内存?
但我们怎样才能得到这个值呢?通过 ps 或从任何 /proc 文件?
(我知道 smem 工具可以提供帮助,但是有没有内置的方法?)
更新20231015
这个答案提到 /proc/<pid>/smaps_rollup 有总和值:
grep "Private" /proc/1748/smaps_rollup
Private_Clean: 55700 kB
Private_Dirty: 67628 kB
Private_Hugetlb: 0 kB
所以我们可以得到整个值:
awk '/Private/{ sum += $2 } END { print sum }' /proc/1748/smaps_rollup
答案1
答案是从 /proc/pid/smaps 获取有关进程内存使用情况的信息包括执行此操作的说明。它没有具体给出具体的确切命令USS
,但它提供了提出适用于 的命令所需的所有信息和示例USS
。
RSS
可以通过对中的条目求和来获得(大约+)(您不需要将共享/私有共享/脏条目相加)。Rss:
smaps
awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
[...]
USS
中没有报告smaps
,但实际上,它是私有映射的总和,因此您也可以通过相同的方式获取它
因此,如果USS
是私有映射的总和,则与对 求和相同RSS
,但不是对所有行求和Rss:
,而是对所有私有映射求和(/Private/
而不是/Rss:/
):
awk '/Private/{ sum += $2 } END { print sum }' /proc/$$/smaps