記一次優化Linux服務器swap內存過高問題
概述
今天收到zabbix告警,有點奇怪的是swap內存使用很高,但實際使用內存卻不多,下面一起來看看吧:
1. 查看服務器內存使用情況
可以發現實際剩余內存還剩很多,但swap已經使用了90%
2. 查看占用swap過高的進程
正常情況下swap的使用應該是0,所以swap剩余小于80%時,我們便需要關注是哪個進程占用過高。
通過以下命令查看占用swap過高的進程:
- for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk '/Swap:/{aa=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done |sort -k2nr

3. 查看進程
檢查pg數據庫無異常,也沒有任務在跑。

4. 配置內核參數來減少swap的使用
如果內存夠大,其實不必太多的使用 SWAP 分區, 可以通過修改 swappiness 的數值。swappiness=0的時候表示最大限度使用物理內存,然后才是 swap空間,swappiness=100的時候表示積極的使用swap分區,并且把內存上的數據及時的搬運到swap空間里面。
在linux里面,默認設置swappiness這個值等于60。
現在一般1個G的內存可修改為10, 2個G的可改為5, 甚至是0。具體這樣做:
- --盡可能使用內存而不用swap
- echo "vm.swappiness=1">>/etc/sysctl.conf
- sysctl -p
- --刷新SWAP
- --刷新一次SWAP(將SWAP里的數據轉儲回內存,并清空SWAP里的數據)
- swapoff -a && swapon -a
- --清理緩存
- sync
- echo 3> /proc/sys/vm/drop_caches
5. 處理后結果
可以發現問題已解決。
