前段时间一直关注MYSQL服务器的交换分区使用情况,发现一种情况,即便物理内存仍有空余,仍会使用交换分区。查阅了很多相关资料,原因慢慢被挖掘出来。
首先,系统使用swap分区,并不意味着系统性能下降。这里分两种情况。
一种情况是:系统在检查系统物理内存使用情况时,发现有部分数据长期没有访问,此时,会发生swap,将这部分数据交换到swap分区中。
另一种情况是:应用程序在申请内存时,发现没有可用的系统内存,此时,也会发生swap,这会立即引起系统的强制数据交换动作,整个系统会变的卡顿,反应很慢。
从以上两种情况不难看出,我们需要避免的是第二种情况。如果,大家想避免第一种情况,让系统尽量不去使用swap分区,可以调整一下linux的内核参数,主要是:
vm.swappiness = 0
vm.dirty_ratio =25
vm.dirty_background_ratio = 10
vm.min_free_kbytes = 1048576
这里提供一个查看swap使用情况的脚本:
#!/bin/bash
# Get current swap usage for all running processes
function getswap {
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"`
do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME)"
let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "Overall swap used: $OVERALL"
}
getswap | grep -v "Swap used: 0"
如果想更深入的了解,推荐另一篇文章:Linux SWAP 深度解读