Google-Compute-Engine

GKE 的 Container-Optimized OS Out-Of-Memory 凍結

  • September 14, 2017

我對 GKE 上的 Container-Optimized OS 有疑問。如果我執行這個簡單的命令https://pastebin.com/raw/0WPAnAzn來消耗所有 RAM,在某些時候主機會凍結並且不響應任何內容。預期行為:該程序應被 OOM 殺手殺死。我已經在庫存的 Ubuntu 和 CentOS 圖像上嘗試過這個,它們工作得很好:程序在沒有凍結的情況下被殺死。

串列控制台中有三種可能的 kmsg 輸出:

  1. 在某些情況下,日誌不包含與凍結相關的任何內容
  2. 有時會出現一系列 OOM 殺死其他程序,然後凍結而沒有任何相關消息
  3. 最有趣的是: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 解決了這個問題。它毫不留情地殺死貪婪的程序。

引用自:https://serverfault.com/questions/870581