1、swap分区
swap分区在系统内存不足时,会使用swap来存放内存中暂不用的数据,这能缓解内存不足,但是由于我们swap分区毕竟是硬盘,比起内存的速度差了几个量级,也就会导致程序变慢。
2、统计进程使用swap情况
其实也就是统计proc下pid里smaps文件中swap项的总和,
#!/bin/bash
function statswap {
for PID in `ls /proc/ | grep "^[0-9].*"`
do
sum=0
NAME=`ps -p $PID -o comm --no-headers`
for size in `grep Swap /proc/$PID/smaps 2>/dev/null| awk '{print $2}'`
do
((sum=$sum+$size))
done
[[ $sum -gt 0 ]] && printf "PID=%-7s SWAP USED: %-8s Kbytes (%-10s)\n" $PID $sum $NAME
done
}
statswap
也可以增加个排序,
[root@CentOS-7-2 /home]# sh statswap.sh | sort -k4nr
PID=948 SWAP USED: 17652 Kbytes (containerd)
PID=1386 SWAP USED: 940 Kbytes (mysqld )
PID=921 SWAP USED: 868 Kbytes (sshd )
PID=1167 SWAP USED: 288 Kbytes (mysqld_safe)
PID=1 SWAP USED: 144 Kbytes (systemd )
PID=616 SWAP USED: 16 Kbytes (ModemManager)
当然也可以不用脚本,直接用一行命令也是可以的,for循环配合awk使用,
[root@localhost ~]# for pid in `ls /proc/ | grep "^[0-9].*"`;do awk 'BEGIN{sum=0}/Swap/{sum+=$2}END{if(sum>0)printf "PID=%-7s SWAP USED: %-8s Kbytes\n", '$pid', sum}' /proc/$pid/smaps 2>/dev/null;done | sort -k4nr
PID=12444 SWAP USED: 1178888 Kbytes
PID=15046 SWAP USED: 1168772 Kbytes
PID=12615 SWAP USED: 1148220 Kbytes
PID=17448 SWAP USED: 654376 Kbytes
PID=32457 SWAP USED: 227580 Kbytes
PID=32458 SWAP USED: 227580 Kbytes
PID=32456 SWAP USED: 184832 Kbytes
3、释放进程使用的swap
有两个方法,一个是关闭swap分区,但是要保证内存余量够,不然就OOM了,
swapoff -a
swapon -a
另一个是重启对应进程了。
4、设置swap使用比例
可以通过/proc/sys/vm/swappiness来设置
/proc/sys/vm/swappiness
The value in this file controls how aggressively the kernel will swap
memory pages. Higher values increase aggressiveness, lower values
decrease aggressiveness. The default value is 60.
如果我们内存足够,就可以将该值设置为0,这样内核就尽可能不去使用swap分区,避免程序进入swap分区后性能下降。