Linux /proc/pid/smaps各字段含义:
# cat /proc/$PID/smaps
/proc/
比如私有内存是200k, 共享内存500k和4个其它进程共享,那么是Pss就是200k+(500/(1+4))=200k+100k=300k。
这样所有进程的Pss相加就不会有重复相加的顾虑,因为Pss中已经将共享内存部分帮我们算好了。
参考命令: # awk '/Pss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
在Linux服务器上查看内存占用前10的进程:
# for i in $( ls /proc/ |grep "^[0-9]"|awk '$0 >100') ;do cmd="";[ -f /proc/$i/cmdline ] && cmd=`cat /proc/$i/cmdline`;[ "$cmd"X = ""X ] && cmd=$i;awk -v i="$cmd" '/Rss:/{a=a+$2}END{printf("%s:%d\n",i,a)}' /proc/$i/smaps 2>/dev/null; done | sort -t: -k2nr | head -10
这种方法,实际上导致不少地方会被重复计算。
RSS 表示常驻内存,把进程用到的共享内存也算了进去,所以直接累加会导致共享内存被重复计算,不能得到准确的答案。
查看使用内存最多的10个进程
# ps -aux | sort -k4nr | head -n 10
查看使用CPU最多的10个进程
# ps -aux | sort -k3nr | head -n 10
(k代表从第几个位置开始,后面的数字4即是其开始位置,结束位置如果没有,则默认到最后;n指代numberic sort,根据其数值排序;r指代reverse,这里是指反向比较结果,输出时默认从小到大,反向后从大到小。)
关于文件系统与磁盘的区别
使用 grep 查找 Pss 指标后,再用 awk 计算累加值
# grep Pss /proc/[1-9]*/smaps | awk '{total+=$2}; END {printf "%d kB\n", total }'
# yum -y install epel-release
# smem --help
# smem
# smem| awk '{total+=$6};END{printf "%d KB\n",total}'
往磁盘写文件和往文件系统写数据:
# dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048
# dd if=/dev/urandom of=/tmp/test.file bs=1M count=2048
从磁盘读数据和从文件系统读数据:
# dd if=/tmp/test.file of=/dev/null bs=1M count=1024
# dd if=/dev/sda1 of=/dev/null bs=1M count=1024
按VmSwap使用量对进程排序,输出进程名称、进程ID以及SWAP用量
# for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/ {printf $2 " " $3} END{print ""}' $file; done | sort -k 3 -n -r | head
# yum -y install smem
# smem --sort swap
参考
Linux性能优化实战
https://time.geekbang.org/column/article/74633
Linux监控工具介绍系列——smem
https://linux.cn/article-7681-1.html
https://www.cnblogs.com/kerrycode/archive/2015/12/26/5079319.html