1. 程式人生 > >被swap坑了

被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:

[[email protected]****** ~]#  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:網名為什麼那麼長