进程内存使用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的区别问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。