实用而简洁的命令总能给程序调试和问题分析带来极大的方便。有一个查看进程内存的命令,也许你的系统中已经拥有,那就是pmap。pmap命令可以报告某个或多个进程的内存使用情况,实际上是统计/proc/<pid>/maps数据。可以使用pmap 判断主机中哪个进程因占用过多内存导致内存瓶颈。注意,pmap监控的是虚拟内存。
比如查看进程proc_mgr的内存使用详细状况:
root@base0:/root>ps -ef | grep proc_mgr
root 9389 1 0 15:02 ? 00:00:00 /usr/local/bin/proc_mgr -f
root 25249 16932 0 15:36 pts/0 00:00:00 grep pr
root@base0:/root> pmap 9389
9389: /usr/local/bin/proc_mgr -f
08048000 8K r-x-- /usr/local/bin/proc_mgr
0804a000 4K rw--- /usr/local/bin/proc_mgr
0804b000 132K rw--- [ anon ]
b753a000 4K rw--- [ anon ]
b753b000 1292K r-x-- /lib/libc-2.5.so
b767e000 8K r---- /lib/libc-2.5.so
b7680000 4K rw--- /lib/libc-2.5.so
b7681000 12K rw--- [ anon ]
b7684000 76K r-x-- /lib/libpthread-2.5.so
b7697000 4K r---- /lib/libpthread-2.5.so
b7698000 4K rw--- /lib/libpthread-2.5.so
b7699000 12K rw--- [ anon ]
b769c000 44K r-x-- /lib/libgcc_s-4.1.2-20080825.so.1
b76a7000 4K rw--- /lib/libgcc_s-4.1.2-20080825.so.1
b76a8000 148K r-x-- /lib/libm-2.5.so
b76cd000 4K r---- /lib/libm-2.5.so
b76ce000 4K rw--- /lib/libm-2.5.so
b76cf000 888K r-x-- /usr/lib/libstdc++.so.6.0.8
b77ad000 12K r---- /usr/lib/libstdc++.so.6.0.8
b77b0000 8K rw--- /usr/lib/libstdc++.so.6.0.8
b77b2000 24K rw--- [ anon ]
b77b8000 24K r-x-- /lib/librt-2.5.so
b77be000 4K r---- /lib/librt-2.5.so
b77bf000 4K rw--- /lib/librt-2.5.so
b77c4000 4K rw--- [ anon ]
b77c5000 4K r-x-- [ anon ]
b77c6000 100K r-x-- /lib/ld-2.5.so
b77df000 4K r---- /lib/ld-2.5.so
b77e0000 4K rw--- /lib/ld-2.5.so
bfbcf000 132K rw--- [ stack ]
total 2976K
本进程占用的内存总共2976K。包含程序本身和相关的各个共享库。以ld-2.5.so为例,程序或共享库的各个部分解释如下:
b77c6000 100K r-x-- /lib/ld-2.5.so //链接地址0xb77c6000,只读r和可执行x,说明是代码
b77df000 4K r---- /lib/ld-2.5.so //只读r,说明是只读的字符串,虽然不多,但也要占用至少一个4k的页
b77e0000 4K rw--- /lib/ld-2.5.so //可读r和可写w,说明是全局变量
用pmap命令连续监控内存使用最高进程的详细内存使用状况,shell脚本如下:
LOG_FILE=/tmp/process_memory_status.log
echo "Memory status of the process using most memory" >> "${LOG_FILE}"
while true; do
date >> "${LOG_FILE}"
ps aux | sort -r -k 4 | head -6 >> "${LOG_FILE}"
PID=$(ps aux | sort -nr -k 4 | head -1 | awk '{print $2}')
pmap $PID >> "${LOG_FILE}"
sleep 5
done