Centos 伺服器未正確使用 SWAP 並出現 OOM
最近我的伺服器出現了一些嚴重的記憶體問題。就在前幾天,我的伺服器完全沒有響應,oom-killer 開始隨機殺死服務(httpd、php 等)。我什至無法通過 SSH 連接到我的伺服器,但我能夠 PING 它。
我確實查看了核心消息日誌,但沒有任何明確的跡象表明導致記憶體問題的原因 - 我只能看到所有 oom-killer 消息。
sar -r
命令:03/15/2012 12:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad 12:10:01 AM 2881812 582380 16.81 26652 250192 4192944 0 0.00 0 12:20:01 AM 2883600 580592 16.76 27104 250196 4192944 0 0.00 0 12:30:01 AM 2878576 585616 16.90 27656 250320 4192944 0 0.00 0 12:40:01 AM 2851856 612336 17.68 28312 271540 4192944 0 0.00 0 12:50:01 AM 2843560 620632 17.92 28968 274468 4192944 0 0.00 0 01:00:01 AM 2843892 620300 17.91 29440 274644 4192944 0 0.00 0 01:10:01 AM 22868 3441324 99.34 60764 2947884 4192936 8 0.00 8 01:20:01 AM 13836 3450356 99.60 62064 2882544 4192844 100 0.00 92 01:30:03 AM 14024 3450168 99.60 7820 3040976 4192844 100 0.00 0 01:40:01 AM 18600 3445592 99.46 18720 3039152 4192844 100 0.00 0 01:50:01 AM 25352 3438840 99.27 20048 3034584 4192844 100 0.00 0 02:00:01 AM 22572 3441620 99.35 20872 3036896 4192844 100 0.00 0 02:10:01 AM 21408 3442784 99.38 21776 3038236 4192844 100 0.00 0 02:20:01 AM 23240 3440952 99.33 23168 3032372 4192844 100 0.00 0 02:30:01 AM 72392 3391800 97.91 25100 2981488 4192844 100 0.00 0 02:40:01 AM 70876 3393316 97.95 25824 2981756 4192844 100 0.00 0 02:50:01 AM 74200 3389992 97.86 26464 2981860 4192844 100 0.00 0 03:00:01 AM 64980 3399212 98.12 32616 2982240 4192844 100 0.00 0 03:10:01 AM 63704 3400488 98.16 33564 2984268 4192844 100 0.00 0 03:20:01 AM 59564 3404628 98.28 34592 2988936 4192844 100 0.00 0 03:30:01 AM 53972 3410220 98.44 35740 2992484 4192844 100 0.00 0 03:40:01 AM 89120 3375072 97.43 36472 2956088 4192844 100 0.00 0 03:50:01 AM 88788 3375404 97.44 36920 2956324 4192844 100 0.00 0 04:00:01 AM 78540 3385652 97.73 37740 2964452 4192844 100 0.00 0 04:10:01 AM 21720 3442472 99.37 106636 2892836 4192844 100 0.00 0 04:20:01 AM 22796 3441396 99.34 107172 2890796 4192844 100 0.00 0 04:30:01 AM 30604 3433588 99.12 107812 2884644 4192844 100 0.00 0 04:40:01 AM 32744 3431448 99.05 108568 2875944 4192844 100 0.00 0
這裡
top
按交換大小排序:top - 14:32:01 up 15:37, 1 user, load average: 0.10, 0.10, 0.04 Tasks: 110 total, 3 running, 107 sleeping, 0 stopped, 0 zombie Cpu(s): 0.5%us, 0.3%sy, 0.0%ni, 98.4%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 3464192k total, 2663384k used, 800808k free, 140796k buffers Swap: 4192944k total, 100k used, 4192844k free, 2073748k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND 1975 mysql 15 0 222m 43m 4652 S 0.0 1.3 0:11.82 178m mysqld 1859 named 22 0 161m 5228 1948 S 0.0 0.2 0:00.04 156m named 2144 root 18 0 143m 47m 1072 S 0.0 1.4 0:00.00 95m spamd 2119 root 15 0 143m 49m 2628 S 0.0 1.5 0:01.17 94m spamd 2161 root 15 0 93372 1280 936 S 0.0 0.0 0:00.01 89m pure-ftpd 2163 root 18 0 91016 976 804 S 0.0 0.0 0:00.01 87m pure-authd 20035 root 15 0 91800 3096 2408 S 0.0 0.1 0:00.00 86m sshd 19432 root 15 0 92232 3656 2900 R 0.0 0.1 0:00.00 86m sshd 2377 root 19 0 93268 14m 1940 S 0.0 0.4 0:00.00 76m cpdavd 2380 root 15 0 87824 11m 1520 S 0.0 0.3 0:00.07 74m cpsrvd-ssl 3115 root 15 0 74832 1168 584 S 0.0 0.0 0:00.05 71m crond 18548 root 18 0 73624 3036 236 S 0.0 0.1 0:00.00 68m httpd 19713 nobody 18 0 73760 4460 1584 S 0.0 0.1 0:00.00 67m httpd 19712 nobody 15 0 73760 4484 1584 S 0.0 0.1 0:00.00 67m httpd 19709 nobody 18 0 73624 4460 1584 S 0.0 0.1 0:00.00 67m httpd 19508 nobody 15 0 73760 4600 1680 S 0.0 0.1 0:00.00 67m httpd 19162 nobody 15 0 73756 4640 1708 S 0.0 0.1 0:00.01 67m httpd 19154 nobody 15 0 73756 4656 1728 S 0.0 0.1 0:00.00 67m httpd 19157 nobody 15 0 73756 4696 1740 S 0.0 0.1 0:00.01 67m httpd 19327 nobody 15 0 73756 4700 1740 S 0.0 0.1 0:00.01 67m httpd 19163 nobody 15 0 73756 4768 1836 S 0.0 0.1 0:00.00 67m httpd 19164 nobody 15 0 73756 4788 1856 S 0.0 0.1 0:00.00 67m httpd 2145 root 18 0 73624 5740 2940 S 0.0 0.2 0:00.60 66m httpd 1911 root 20 0 65952 1276 1044 S 0.0 0.0 0:00.01 63m mysqld_safe
出於某種原因,它說它只使用 100k SWAP,但這沒有任何意義。不是
VIRT
每個程序使用的SWAP量嗎?*** 更新 ***
以下是有關文件系統的更多資訊:
# df -T Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/md2 ext3 468924192 17215692 427504176 4% / /dev/md1 ext3 2030672 58788 1867068 4% /tmp /dev/md0 ext3 101018 13414 82388 15% /boot tmpfs tmpfs 1732096 0 1732096 0% /dev/shm
*** 更新 2 ***
這是
free -m
我昨天在伺服器處於此 OOM 狀態時設法執行的:total used free shared buffers cached Mem: 3383 3372 10 0 0 6 -/+ buffers/cache: 3365 17 Swap: 4094 4094 0
我通常按記憶體排序(頂部的“M”)來解決這些問題——它向您顯示每個程序正在使用的實際記憶體量(並且經常觸摸以使其遠離最近最少使用的隊列)被交換)。
VIRT = RES + SWAP
要檢查的另一件事是 /tmp 是否是 tmpfs 文件系統,以及是否有東西在那裡寫入大量數據。
我實際上對我所看到的有點困惑。此
sar
輸出是在您發生中斷時的時間間隔內,還是只是預設輸出?top
輸出來自完全不同的時間,14:32 ?此外,在您獲取這些統計資訊時,它並沒有真正使用交換,因為它不需要 - 近 3G 的記憶體目前被用作磁碟記憶體(“kbcached”)並且您只有 kbmemused - kbcached + kbbuffers = 664072KiB (648MiB)
$$ at 04:40:01 $$在實際過程中使用。 因為沒有程序映像本身使用太多記憶體,但 oom-killer 啟動了,所以我猜想某些東西開始執行大量文件 I/O 並開始比寫入磁碟更快地臟頁。不過,我不確定這是否應該觸發 oom-killer。
這些臟頁都不會進行交換,因為將文件本身的內容寫出就像將數據寫入交換一樣容易。
顯而易見的猜測是 mysqld 正在執行此操作,儘管我懷疑它會使用 O_DIRECT 打開其文件,這建議核心盡量減少對記憶體的影響(前提是 DB 伺服器正在執行自己的記憶體)。
更新
根據
free
更新 #2 的輸出,您主題中問題的答案是它使用交換就好了;有些東西只是用了所有的東西。您提供的其他數據對於最近啟動的系統來說是正常的。更新 2
我在下面提到了 mysql,但老實說,我會很驚訝這是罪魁禍首。我會首先懷疑 spamd,即在 Apache 中執行的 CPanel 程序或 Web 應用程序。
我還一直假設您正在執行一個相當新的發行版,而沒有對系統可調參數進行任何調整,並且您正在使用安全更新檔。過去幾個月有一個 BIND 漏洞利用導致 DoS,但我不記得該漏洞是否觸發了記憶體耗盡或其他原因。我最近也讀過 CPanel 漏洞利用,但我不知道它們的最新情況。