进程内存使用PSS和VSZ的区别,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
可以使用 ps aux 命令获取每进程的内存使用,其中VSZ表示虚拟内存使用大小,RSS(resident set size)表示常驻内存的大小,来自于/proc/PID/status文件。
~ # ps aux | head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.1 18984 1968 ? Ss 10:58 0:47 /sbin/hello
root 2 0.0 0.0 0 0 ? S 10:58 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10:58 0:10 [ksoftirqd/0]
但RSS并不代表进程的实际内存消耗,因为不同的进程之间会共享内存,所以把所有进程RSS进行累加的方法会重复计算共享内存,得到的结果是偏大的。正确的方式是累加/proc/PID/smaps中的Pss(process's proportional share of this mapping)字段。选取某个vma的统计数据:
01e70000-01ef6000 rw-p 00000000 00:00 0 [heap]
Size: 536 kB
Rss: 408 kB
Pss: 408 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 408 kB
Referenced: 408 kB
Anonymous: 408 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr mr mw me ac sd
每个虚拟内存区域(VMA)是一个连续的虚拟地址范围,并且它们不会重叠。一个vm_area_struct实例完整的描述了一个内存区域,包括起止地址、访问权限标志以及用于指出被映射文件(如果存在)的vm_file字段。其中,size表示这段虚拟空间的大小,Rss表示驻留内存的大小,Pss表示分摊后的内存大小,Referenced表示总共被引用或被访问的内存大小,Anonymous表示没有映射到文件的内存大小,Swap也是匿名内存,表示交换分区内存的大小。各个字段的关系如下:
USS = Private_Clean + Private_Dirty
Pss = USS + (Shared_Clean + Shared_Dirty)/n
RSS = USS + Shared_Clean + Shared_Dirty
以hello进程为例,使用前面介绍的统计内存的数据:
使用ps
~ # ps aux | grep /sbin/hello
root 1182 0.7 0.2 474208 5636 ? Sl 11:00 1:38 /sbin/hello
grep -w Pss /proc/1182/smaps | awk 'BEGIN{sum=0} {sum+=$2} END {print "total mem:"sum}'
total mem:1752
可以看到,RSS与PSS相差非常大。进程的内存统计一定是使用Pss。
关于进程内存使用PSS和VSZ的区别问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/yelinfei/blog/5056355