swap初探

swap初探

線上機器不停發郵件報警,swap使用超過閥值。實在受不了郵件,決定乾點運維的活。看看情況。

查swap整體使用情況

  • free -m

    最先最直接就是這條命令了,結果類似下圖

                   total       used       free
     Swap:         34175       11374      22801
    
  • sar -r(不同版本sar參數不同,sar -h看看就好),如下圖

    Linux 2.6.18-308.el5 (a05.api.box.ott.b28.youku)        04/07/16
    00:00:01   kbmemfree   kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
    00:10:01     11397792  21517364     65.37    305740  14510832   4192956         0      0.00         0
    00:20:01     11364748  21550408     65.47    307644  14539508   4192956         0      0.00         0
    00:30:01     11341260  21573896     65.54    308772  14566856   4192956         0      0.00         0
    00:40:01     11314416  21600740     65.63    309704  14593728   4192956         0      0.00         0
    00:50:01     11286120  21629036     65.71    310612  14619356   4192956         0      0.00         0
    01:00:01     11262720  21652436     65.78    311348  14642836   4192956         0      0.00         0
    .
    .
    .
    Average:     10691597  22223559     67.52    331646  15190674   4192956         0      0.00         0
    

    sar和free都不是實時數據。如果要看實時數據vmstat

  • vmstat -2(2秒刷新一次)。結果如圖

    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
    r   b   swpd   free   buff  cache      si   so    bi    bo    in     cs us sy id wa st
    5   0      0 9797884 356252 16031016    0    0     0     8     0      0 10  4 87  0  0
    0   0      0 9797988 356300 16031348    0    0     0   185  11497 30788  9  2 89  0  0
    17  0      0 9797240 356304 16031532    0    0     0     0  11430 30918  8  2 90  0  0

    si: Amount of memory swapped in from disk (/s).

    so: Amount of memory swapped to disk (/s).

    si和so越小越好咯,只要不是一直不爲0,都沒事

按進程查看swap使用

  • top(top命令提供的SWAP信息只是一個理論值,計算公式是:SWAP=VIRT-RES,不可信)

    top --> 按「f」進入字段選擇 --> 按「p」選擇「SWAP」字段,再按「u」選擇Page Fault字段 --> 回車確認 -->結果如下 --> 「Shifl」+「+」+「>」按某個字段排序,默認按cpu使用率

    top - 10:45:37 up 29 days, 17:06,  1 user,  load average: 0.02, 0.22, 0.31
    Tasks: 616 total,   5 running, 611 sleeping,   0 stopped,   0 zombie
    Cpu(s):  8.9%us,  2.2%sy,  0.0%ni, 88.3%id,  0.0%wa,  0.0%hi,  0.6%si,  0.0%st
    Mem:  32986852k total, 32795452k used,   191400k free,   146108k buffers
    Swap:  4194300k total,     1296k used,  4193004k free, 26758872k cached
    
    PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP  nFLT COMMAND 
    31022 root      19   0 6994m 234m  11m S  0.3  0.7 657:47.61 6.6g  100  java                                                                         
    9344  nobody    20   0  259m  21m 1152 S  0.0  0.1   3:04.89   88    0  nginx                                                                            
    9345  nobody    20   0  259m  21m 1152 S  0.0  0.1   2:54.11   88    0  nginx                                                                            
    9346  nobody    20   0  259m  21m 1152 S  0.0  0.1   3:11.32   88    0  nginx                                                                            
    9347  nobody    20   0  259m  21m 1152 S  0.0  0.1   2:59.73   88    0  nginx                                                                            
    9348  nobody    20   0  259m  21m 1152 S  0.0  0.1   3:03.24   88    0  nginx                                                                            
    9349  nobody    20   0  259m  21m 1152 S  0.0  0.1   3:01.04   88    0  nginx                                                                            
    9350  nobody    20   0  259m  21m 1152 S  6.9  0.1   3:00.65   88    0  nginx                                                                            
    9351  nobody    20   0  259m  21m 1152 S  0.0  0.1   3:09.42   88    0  nginx                                                                            
    9352  nobody    20   0  240m 1548  572 S  0.0  0.0   0:00.20   88    0  nginx                                                                            
    15510  root     20   0  240m 2428 1520 S  0.0  0.0   0:00.09   88    3   nginx                                                                            
    2133  root      20   0  243m 2372  912 S  0.0  0.0   0:00.90    4   53  rsyslogd                                                                         
    1     root      20   0 19232 1112  820 S  0.0  0.0   0:02.22    0    9 init    

    可以看到最高的是個java進程,使用了6.6g,但是我們swap實際只有4g,可以印證數值不準。但是每個進程的使用分佈是準的,就是說java > nginx > rsyslogd這個關係是準的。你可以理解爲,top把每個進程使用的swap同等放大或縮小,但是不改變大小關係。

Swappiness

    從sar結果可以看出物理內存平均使用才67%,但是swap已經被用到了。實際上,當可用內存不足時,系統有兩個選擇:一個是通過SWAP來釋放內存,另一個是刪除Cache中的Page來釋放內存。一個很常見的例子是:當拷貝大文件的時候,時常會發生SWAP現象。這是因爲拷貝文件的時候,系統會把文件內容在Cache中按Page來緩存,此時一旦可用內存不足,系統便會傾向於通過SWAP來釋放內存。

    內核中的swappiness參數可以用來控制這種行爲,缺省情況下,swappiness的值是60:

    sysctl -a | grep swappiness

    vm.swappiness = 60

    意思是:如果系統需要內存,有百分之六十的概率執行SWAP

    考慮到機器內存仍有剩餘,修改此參數,降低使用swap概率,儘可能使用物理內存,但並不意味着永遠不會執行SWAP。網上傳言設置爲0,會有靈異問題出現,公司線上機器不敢拿來做實驗,就設置1好了
    shell> echo "vm.swappiness = 1" >> /etc/sysctl.conf
    shell> sysctl -p
    這個不要隨便設置,請確定物理內存確實是有剩餘,設置0了可能內存耗盡,沒有swap緩衝,系統會立即開始OOM,問題可能會更慘烈。

修改後過了一天再看sar,Average 內存使用飆到99.37%,但是swap確實沒有超過閥值報警。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章