常见误解:
ps aux 命令显示的 RSS 列来统计全部进程总共占用的物理内存大小,这是不合理的。RSS(resident set size)表示常驻内存的大小,但是由于不同的进程之间会共享内存,所以把所有进程RSS进行累加的方法会重复计算共享内存,得到的结果是偏大的。
正确的方法:
累加 /proc/[1-9]*/smaps 中的 Pss 。/proc/<pid>/smaps 包含了进程的每一个内存映射的统计值,Pss(Proportional Set Size)把共享内存的Rss进行了平均分摊,比如某一块100MB的内存被10个进程共享,那么每个进程就摊到10MB。这样,累加Pss就不会导致共享内存被重复计算了。
统计命令如下:
grep Pss /proc/[1-9]*/smaps |awk '{total+=$2}; END {print total}'
注意:
1.全部进程占用的内存并不等于 free 命令所显示的 "used",因为"used"不仅包含了进程所占用的内存,还包含cache/buffer以及kernel动态分配的内存等等。
2.【MemTotal = MemFree + buff/cache + slab + 全部进程占用的内存】。这是不对的,原因之一是:进程占用的内存包含了一部分page cache,换句话说,就是进程占用的内存与page cache发生了重叠。比如进程的mmap文件映射同时也统计在page cache中。