被swap坑了

  • The Reason

          今天web访问的RT值突然大于200ms,除了CPU略有偏高,发现swap竟然也开始使用了,对于一个最大使用堆空间只有6G的java程序有的server使用swap空间甚至达到4G,导致web响应性能不同程度的下降,于是不愿再使用swap.

  • History

         之前将  ”vm.overcommit_memory=1 “ 强制写入/etc/security/limits.conf文件,本想在程序请求分配内存时,永远假装还有足够的内存,不想彻底禁用swap的使用选择权,但是发现 cat  /proc/sys/vm/overcommit_memory 并没有生效,效果也不是很好,不得不放弃这种妥协的办法。于是采取简单粗暴的办法。


  • Action
     提醒:当下面所有程序走完的时候,发现部分jboss起不来了,针对一向消耗内存的java进程,堆空间要求的最小空间已经超过剩余物理内存使用的最大空间,在资源有限的情况下,jboss自然是起不来了。针对此种情况:可以释放缓存,毕竟不是数据库,但是最终为了规避风险,还是放弃释放缓存,reboot了。。。所以如此做法要达到无痛的切换是不太可能的了。。。

1. 首先查看哪些进程占用swap较多,

执行语句: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;done| sort -k2nr | head

eg:

[root@****** ~]#  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;done| sort -k2nr | head

awk: cmd. line:1: fatal: cannot open file`/proc/17269/smaps' for reading (No such file or directory)

awk: cmd. line:1: fatal: cannot open file`/proc/17270/smaps' for reading (No such file or directory)

awk: cmd. line:1: fatal: cannot open file`/proc/17271/smaps' for reading (No such file or directory)

awk: cmd. line:1: fatal: cannot open file`/proc/17272/smaps' for reading (No such file or directory)

31341 2688.97M

2026 4.19922M

2220 0.863281M

2464 0.820312M

2457 0.792969M

2342 0.617188M

2540 0.578125M

2509 0.550781M

1719 0.53125M

75276 0.480469M

 

2.找出进程,杀掉占用最大的那个进程,对于我们的web环境,基本无疑问是jboss进程。。。

eg

 执行指令:  ps axu|grep  31341



3.强行杀掉此进程后,关掉swap

执行指令:  pkill -9 java;swapoff –a

4.再次查看swap,total为0,再没有使用了。。。


5.设置开机关闭swap

echo  ‘swapoff  -a’ >> /etc/rc.d/rc.sysinit

6.为确保万一,极力减少进程对swap的使用,设置最大限度降低swap的加载:

vm.swapness = 0

7.最后再启动jboss服务。。。。

 

 

总结:粗糙脚本执行如下:

~]# cat   swapoff.sh

#!/bin/bash
#Describle  close swap
#History 01/03/2017
#Author DYL
#Version  1.0


#杀掉jboss进程
        pkill -9 java


#关掉swap
        swapoff -a


#开机关闭swap
        echo 'swapoff -a' >>  /etc/rc.d/rc.sysinit
#最大限度降低swap的加载
        grep "swapness" /etc/sysctl.conf
        if [ $? -eq 0 ]
        then
                sed -i "s/vm.swap.*$/vm.swappiness = 0/g"  /etc/sysctl.conf
        else
                echo "#Set least swap partion"
                echo "vm.swappiness = 0" >>   /etc/sysctl.conf


        fi

#启动jboss服务
        su  jboss  -c "sh /jboss/jboss/bin/jboss.sh "



###############The End####################



Author:网名为什么那么长






你可能感兴趣的:(被swap坑了)