记一次服务器Swap空间占用过高修复过程

 全文字数 1219 阅读约 4 分钟

最近登录服务器发现gz004的服务器突然swap占用达到了95%,但是还有接近20g的内存没有使用,就直接吃满了swap空间,效果如下:

1600102651000Lark20200914111831.png

首先的话就是开始尝试找出占用swap空间最高的20个进程,看下是否可以重启或者kill掉一些无用的进程

可以通过下面的shell命令来查看

for i in $(cd /proc;ls | grep "^[0-9]"|awk '$0 >100');do awk '/Swap:/{a=a+$2}END{print "'$i'", a/1024"M"}' /proc/$i/smaps 2>/dev/null;done | sort -k2nr | head -20

发现大部分是被php-fpm进程给占用了,赶快进行了重启,重启后swap占用果然降低了下来,但是为什么会占用这么高呢?还要继续往下排查。

查看swappiness,控制swap的系统参数

Swappiness:表示使用物理内存限度

Swappiness为0(100%-0=100%)表示物理内存使用到100%的时候使用swap空间

Swappiness为60(100%-60%=40%)表示物理内存使用到40%的时候使用swap空间

如果swappiness设置太大(内存的速度会比磁盘快很多),这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。

cat /proc/sys/vm/swappiness

发现默认值为60,当内存使用到40%时就会开始使用swap空间,32g的40%为12.8g,当内存占用到达到这个时候,就会开始使用swap空间来避免物理内存用完。

最终整理了下解决方案,整体思路如下:

(一)、调整swappiness参数

当物理内存使用到了80%的时候,才会去使用swap空间,如果为了几支的性能这个值还可以设置的更小一些

echo vm.swappiness=20 >> /etc/sysctl.conf 

重新激活systcl生效

sysctl -p

(二)、调整swap分区大小

1.创建指定大小的swap空间

dd if=/dev/zero of=/swapfile bs1024 count65536

2.改变文件权限

chmod 600 /swapfile

3)设置swap文件

mkswap /swapfile

4.设置swapfile立刻临时生效

swapon /swapfile

5.编辑/etc/fstab,使启动生效

/swapfile swap swap defaults 0 0

(三)、重启或杀死占用过高的进程

先找出占用最高的20个进程的Pid,然后通过kill命令进行清理,这个风险系数太高,不太推荐。

for i in $(cd /proc;ls | grep "^[0-9]"|awk '$0 >100');do awk '/Swap:/{a=a+$2}END{print "'$i'", a/1024"M"}' /proc/$i/smaps 2>/dev/null;done | sort -k2nr | head -20
阅读 57发布于 2020-09-15 00:56:33
哈希表内部博客,转载请联系说明!