统计zabbix_server及其子进程实际使用总内存
背景
扩容当前zabbix监控服务器,需要事先统计zabbix_server进程使用总内存。
解决方案
for pid in `ps -C zabbix_server -o pid --no-heading`; do grep Pss /proc/$pid/smaps;done|awk '{sum+=$2};END{print sum/1024/1024"G"}'
- 用ps命令统计所有zabbix_server进程的rss值进行累加得出占用总内存,此种方法不对,会导致结果偏大。如下图,我本机总内存20G,但使用该方法算出来有24G。
-
正确方法是累计/proc/$zabbixpid/smaps中的Pss值。
解释(引用大牛原文)
很多人通过累加 “ps aux” 命令显示的 RSS 列来统计全部进程总共占用的物理内存大小,这是不对的。RSS(resident set size)表示常驻内存的大小,但是由于不同的进程之间会共享内存,所以把所有进程RSS进行累加的方法会重复计算共享内存,得到的结果是偏大的。
正确的方法是累加 /proc/[1-9]*/smaps 中的 Pss 。/proc/<pid>/smaps 包含了进程的每一个内存映射的统计值,详见proc(5)的手册页。Pss(Proportional Set Size)把共享内存的Rss进行了平均分摊,比如某一块100MB的内存被10个进程共享,那么每个进程就摊到10MB。这样,累加Pss就不会导致共享内存被重复计算了。