合 Linux中查询swap占用率最高的前几个进程
smem
1 2 3 4 5 | yum install -y smem -- swap消耗最多的前10个进程(单位KB,内存使用量(PSS,单位为KB)、swap使用量(单位为KB)) smem -s swap -r -n | head -n 11 |
脚本1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | cat > /tmp/swap_check.sh <<"EOF" #!/bin/bash #script name: swap_check.sh #author: wuhs #version: v1 #description: 这是一个检查哪些进程使用了SWAP分区的脚本 do_swap () { SUM=0 OVERALL=0 #获取进程目录 for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do #获取进程PID PID=`echo $DIR | cut -d / -f 3` #获取进程名称 PROGNAME=`ps -p $PID -o comm --no-headers` #获取进程的所有分区中SWAP值 for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` do #进程swap值求和 let SUM=$SUM+$SWAP done echo "PID=$PID - Swap used: $SUM - $PROGNAME" #总共swap分区值求和 let OVERALL=$OVERALL+$SUM SUM=0 done echo "Overall swap used: $OVERALL" } do_swap > /tmp/tmp.txt #查询结果排序并截取top10 cat tmp.txt |awk -F[\ \(] '{print $5,$1,$7}' | sort -n | tail -10 cat tmp.txt |tail -1 rm -rf tmp.txt EOF sh /tmp/swap_check.sh |
脚本2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | cat > /tmp/swap_check2.sh <<"EOF" #!/bin/bash echo -e "PID\t\tSwap\t\tProc_Name" # 拿出/proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息) for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]` do # 让进程释放swap的方法只有一个:就是重启该进程。或者等其自动释放。 # 如果进程会自动释放,那么我们就不会写脚本来找他了,找它都是因为它没有自动释放。 # 所以我们要列出占用swap并需要重启的进程,但是init这个进程是系统里所有进程的祖先进程 # 重启init进程意味着重启系统,这是万万不可以的,所以就不必检测他了,以免对系统造成影响。 if [ $pid -eq 1 ];then continue;fi # Do not check init process # 判断改进程是否占用了swap grep -q "Swap" /proc/$pid/smaps 2>/dev/null if [ $? -eq 0 ];then # 如果占用了swap swap=$(grep Swap /proc/$pid/smaps | gawk '{ sum+=$2;} END{ print sum }') # 占用swap的总大小(单位:KB) proc_name=$(ps aux | grep -w "$pid" | grep -v grep | awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}') # 进程名 if [ $swap -gt 0 ];then # 如果占用了swap则输出其信息 echo -e "$pid\t${swap}\t$proc_name" fi fi done | sort -k2 -n | gawk -F'\t' '{ # 按占用swap的大小排序,再用awk实现单位转换。 # 如:将1024KB转换成1M。将1048576KB转换成1G,以提高可读性。 pid[NR]=$1; size[NR]=$2; name[NR]=$3; } END{ for(id=1;id<=length(pid);id++) { if(size[id]<1024) printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]); else if(size[id]<1048576) printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]); else printf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]); } }' EOF sh /tmp/swap_check2.sh |