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確實沒有超過閥值報警。