首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >/proc/$pid/ vmRSS值似乎不准确?为什么?

/proc/$pid/ vmRSS值似乎不准确?为什么?
EN

Unix & Linux用户
提问于 2019-12-16 02:26:37
回答 1查看 1.7K关注 0票数 1

我编写了一个测试程序来帮助我理解不同内存实用程序的输出字段,例如空闲、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的输出是

代码语言:javascript
运行
复制
VmRSS:     16468 kB

与ps的输出保持一致。

代码语言:javascript
运行
复制
8941  0.0  0.1 4102600 16468 pts/22  Sl+  10:07   0:00 ./a.out

而pmap -x 8941的/proc/8941/smaps和输出的加法是:

代码语言:javascript
运行
复制
$ 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”对我来说没有意义。

有人能解释一下发生了什么吗?提前谢谢。

EN

回答 1

Unix & Linux用户

发布于 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)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/557418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档