我编写了一个测试程序来帮助我理解不同内存实用程序的输出字段,例如空闲、ps、top、/proc/$pid/statm、/proc/$pid/smaps、/proc/$pid/statm等。最后,有一个问题出现了,我无法理解:
问:/proc/$pid/ vmRss字段与在/proc/$pid/smaps中计算出来的字段不一样(通过将所有Rss字段加起来)。
前者的值应该是"ps“命令的RSS输出的源,而后一个是"pmap -x”命令的源。
我编写的测试程序是用相同的过程创建20个线程,其中每个线程调用malloc(4*1024) 256次,导致每个线程占用内存1MB,因此1MB/线程* 20线程= 20 1MB。
基于这个程序,来自/proc/$pid/status的VmRSS的输出是
VmRSS: 16468 kB
与ps的输出保持一致。
8941 0.0 0.1 4102600 16468 pts/22 Sl+ 10:07 0:00 ./a.out
而pmap -x 8941的/proc/8941/smaps和输出的加法是:
$ cat /proc/8941/smaps | grep Rss | awk '{print $2}' | awk '{s+=$1} END {printf "%.0f\n", s}' /dev/stdin
22536
$ pmap -x 8941 | tail -n 1
total kB 4102604 22536 20992
空闲命令的输出使我确信我的程序确实消耗了20+MB内存,因此RSS值"ps“和"/proc/$pid/status”对我来说没有意义。
有人能解释一下发生了什么吗?提前谢谢。
发布于 2021-10-30 04:01:16
请参考https://www.kernel.org/doc/man-pages/的Linux手册页项目。他们可以解释你看到了什么。
在本文撰写之时(第5.13版),proc(5)说/proc// VmRSS中的状态是不准确的。
VmRSS常驻设置大小。注意,这里的值是RssAnon、RssFile和RssShmem的总和。此值不准确;请参见上面的/proc//statm。
proc(5)说RssAnon和RssFile是不准确的,所以VmRSS必须是不准确的。
要获得准确的值,您应该参考/proc//smaps (手册页在/proc//statm下面这样说)。
而且,ps(1)说
大小和RSS字段不计算进程的某些部分,包括页表、内核堆栈、struct thread_info和struct task_struct。这通常是至少20 KiB的内存,通常是驻留的。大小是进程的虚拟大小(code+data+stack)。
https://unix.stackexchange.com/questions/557418
复制相似问题