Google-Compute-Engine
GKE 的 Container-Optimized OS Out-Of-Memory 凍結
我對 GKE 上的 Container-Optimized OS 有疑問。如果我執行這個簡單的命令https://pastebin.com/raw/0WPAnAzn來消耗所有 RAM,在某些時候主機會凍結並且不響應任何內容。預期行為:該程序應被 OOM 殺手殺死。我已經在庫存的 Ubuntu 和 CentOS 圖像上嘗試過這個,它們工作得很好:程序在沒有凍結的情況下被殺死。
串列控制台中有三種可能的 kmsg 輸出:
- 在某些情況下,日誌不包含與凍結相關的任何內容
- 有時會出現一系列 OOM 殺死其他程序,然後凍結而沒有任何相關消息
- 最有趣的是:OOM 導致核心崩潰(https://pastebin.com/raw/gtdsg6vQ)
凍結伴隨著接近 100% 的 CPU 負載。
所以這是預期的行為還是有問題?
經過一些實驗,我發現它與 GKE 或 GCP 無關。而且它甚至與COS圖像無關。
實際上這就是Linux核心處理OOM的方式。OOM 殺手啟動得太晚,並且在高度記憶體受限的環境中起作用。它決定使用 processes’ 殺死哪個程序
oom_score
。在主機上執行 Kubernetes 時,有許多具有高
oom_score_adjust
價值的程序(這些是在其規範中沒有記憶體限制的pod )。如果您的 RAM 吞噬 pod 設置了限制,則其結果oom_score
可能會低於許多其他程序。在這種情況下,OOM 殺手將首先殺死那些最高的程序,
oom_score
然後才有機會殺死真正貪婪的程序。我不知道為什麼,但在這種情況下 Linux 完全凍結了。作為一種解決方法,我找到了這個工具。將它安裝為 DaemonSet 解決了這個問題。它毫不留情地殺死貪婪的程序。