來自 apache 的 408 錯誤,來自 dhclient 和 sshd 的“fork:無法分配記憶體”
在過去的三個晚上,我有一個 EC2 伺服器開始給出 408 錯誤以響應 Web 請求。當我早上進來的時候,我不能ssh進來;我必須使用管理控制台重新啟動。dhclient 和 sshd 都給出了錯誤消息,上面寫著“fork:無法分配記憶體”。
據我所知,這只發生在一台伺服器上。每次細節都略有不同:
第一天晚上,它首先發生在 19:30 左右(根據 /var/log/messages),但仍然有“綁定到”消息。然後從20:00左右到20:30左右,有很多DHCPREQUEST,之後就沒有成功綁定。sshd 錯誤從大約 21:10 開始(根據 /var/log/secure)。
第二天晚上,我們在 18:45 到 19:15 看到 DHCPREQUEST 行,然後開始出現 fork 錯誤。sshd 錯誤從 18:20 開始。
此時我通過 yum 升級了 dhclient,看看是否有幫助。(此時我還沒有看到 sshd 錯誤。)它沒有。
第三個晚上看起來和第一個晚上一樣,18:30 出現分叉錯誤,19:00 到 19:30 出現 DHCPREQUEST。但隨後在凌晨 4 點 15 分,OOM 殺手進來並殺死了一個 httpd 程序。OOM 殺手頭兩個晚上都沒有出現。sshd 錯誤從 19:30 開始,在 4:15 出現很多“Received disconnected”錯誤。
AWS 開發人員論壇上的這個執行緒表明 dhclient 可能在環境變數中存在記憶體洩漏,但如果是這樣,我看不到它。這似乎也不是一個緩慢的洩漏:它每天晚上都在早些時候發生,但是我在升級 dhclient 後在 17:00 重新啟動了伺服器,所以第三次它不到兩個小時。
我考慮過來自 apache 的記憶體洩漏,但它似乎與 apache 日誌中的任何特定內容不相符,而且我無法通過同時向伺服器發送多個記憶體密集型請求來觸發它。在那種情況下,我希望 OOM 殺手整整三個晚上都參與其中。
apache 日誌中有一件值得注意的事情,就是三個連續行的時間戳:24/Feb/2017:02:10:05, 23/Feb/2017:18:23:05, 24/Feb/2017:07 :03:20。這些請求中的第二個是 500,而不是 408。所以我猜該請求以某種方式執行了 8 小時或更長時間,這可能會佔用記憶體。前兩個晚上沒有這樣的事。
基本上,我不知道發生了什麼。我目前的計劃是在同一個歸置組中啟動一個新伺服器,將域指向那個,然後讓兩者都執行,看看會發生什麼。但我正在尋找有關如何診斷和解決此問題的建議。
更新
我已經按照使用者ochach 的建議安裝了一個簡單的ps/cron 監視器後觸發了這個。看來我確實是記憶體不足了, httpd 是罪魁禍首;我不知道為什麼OOM殺手沒有執行。
安裝監控工具並檢查哪個程序記憶體不足。當您知道哪個程序出現記憶體洩漏時,您可以從那裡嘗試隔離問題。還要檢查 dmesg 是否有核心殺死的任何 oom。
要查明問題,您可以添加“ps aux –sort -rss | head -n 10”以每分鐘執行一次並附加到非臨時設備上的文件中。
除此之外,你可以安裝單獨的監控,如 nagios、prometeus 或使用 sar/sysstat。