轉:Linux check mem,cpu,Swap

luckyfriends發表於2016-12-28

1.什麼是swap

inux作業系統將實體記憶體分為多個小的記憶體塊,稱之為頁(pages). 當應用請求的實體記憶體不夠分配時,作業系統會將一段時間之內不用的記憶體頁交換至swap分割槽,從而為應用釋放記憶體空間。

Swap對於系統過來說非常重要:

1.首先,當主記憶體不夠用時,作業系統可以swap out一部分記憶體頁,迅速為當前急需記憶體的應用或者程式分配記憶體;
2.其次,某些記憶體頁只在應用初始化階段用到,之後可能就不再使用了,作業系統可以將這些記憶體頁swap out,從而為應用或者磁碟cache騰出更多的記憶體空間; 

2.swap會帶來哪些問題

我們知道,計算機磁碟I/O通常是系統的瓶頸所在。主記憶體的讀寫速度是納秒級別,而磁碟讀寫速度是毫秒級別,兩者相差3、4個數量級。然而,即使是當前廣泛使用的SSD,讀寫速度相比主記憶體或者CPU cache也相差2、3個數量級。系統發生swap交換越多,那麼系統自然也越慢。

特別對於web伺服器來說,都是面對使用者的互動式應用,因此響應速度尤其重要。如果系統經常因為swap交換而變得響應遲鈍,那麼使用者體驗效果可想而知。

總結成一句話:swap分割槽要有,在關鍵時刻不至於讓你的應用因為記憶體不夠用而被作業系統OOM KILLER幹掉;但是不到關鍵時刻不要進行swap交換,因為這些操作會影響系統的響應速度。

關於swap的swap in和swap out可以從vmstat命令檢視(si表示swap in, so表示swap out).參考: http://xiaobaoqiu.github.io/blog/2015/01/26/vmstatgong-ju/

3.檢視swap佔用

free命令, 參考: http://xiaobaoqiu.github.io/blog/2014/09/04/linux-memory-usage/

4.找到swap佔用元兇

Linux系統中有一個檔案smaps檔案,記錄了當前程式所對應的記憶體映像資訊,路徑為/proc/$pid/smaps.以本機的一個執行緒為例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
xiaobaoqiu@xiaobaoqiu:~/octopress$ sudo cat /proc/3555/smaps | head -16 00400000-00401000 r-xp 00000000 08:13 3444936                            /usr/local/jdk1.7.0_72/bin/java Size:                  4 kB Rss:                   4 kB Pss:                   4 kB Shared_Clean:          0 kB Shared_Dirty:          0 kB Private_Clean:         4 kB Private_Dirty:         0 kB Referenced:            4 kB Anonymous:             0 kB AnonHugePages:         0 kB Swap:                  0 kB KernelPageSize:        4 kB MMUPageSize:           4 kB Locked:                0 kB VmFlags: rd ex mr mw me dw

其中Swap表示這個執行緒佔有Swap的情況.

檢視swap的佔有情況的指令碼,按照佔用swap的佔用多少從高到底排序:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 
#!/bin/bash  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(KB): $SUM    ($PROGNAME )" let OVERALL=$OVERALL+$SUM SUM=0  done echo "Overall swap used: $OVERALL" }  getswap|sort -k4nr

然後執行:

1 
sudo ~/check_swap.sh

5.清除被佔用的swap

在我們明確知道哪些程式吃swap以後,接下來的問題就是我們如何釋放這些swap,釋放swap的意思就是把交換到swap中的資料swap in到實體記憶體頁中。

1.重啟吃swap的服務,比如重啟一下我們的java程式;
2.swapoff + swapon
這個方法的好處是,不用重啟服務,但是需要確保現在有足夠的實體記憶體可以容下從swap中釋放出來的資料。下面給出了swapoff和swapon的具體做法,注意看swapoff後和swapon後,free的輸出有什麼異同;

sudo /sbin/swapoff -a
sudo /sbin/swapon -a

swapoff後,free的輸出裡,swap分割槽的大小變為0,佔用變為0,也就是說swap分割槽中的資料已經釋放到實體記憶體中,同時swap分割槽被禁用。swapon後,free的輸出裡,swap分割槽的容量又恢復了
,也就是說swap分割槽重新被啟用了。當然我們可以把這兩個命令寫到一起:

sudo /sbin/swapoff -a && sudo /sbin/swapon -a

http://xiaobaoqiu.github.io/blog/2015/06/23/linux-swap/
http://blog.csdn.net/longerzone/article/details/8015941

http://www.cnblogs.com/lidabo/p/4738113.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14710393/viewspace-2131566/,如需轉載,請註明出處,否則將追究法律責任。

相關文章