Memory

為什麼 OOM-killer 有時無法殺死資源佔用者?

  • February 18, 2016

如果我輸入我的 shell x=yes``,最終我會得到cannot allocate 18446744071562067968 bytes (4295032832 bytes allocated),因為yes試圖永遠寫入x,直到記憶體不足。我收到一條消息cannot allocate <memory>,因為核心的 OOM 殺手告訴xrealloc沒有更多字節要分配,它應該立即退出。

但是,當我game_engine因為資源不足而要求任何人分配更多不存在的圖形記憶體時,它會轉向我的 RAM 和 CPU 來在那里分配請求的記憶體。

為什麼核心的 OOM-killer 沒有擷取任何game_engine試圖分配大量記憶體的嘗試,就像它一樣x=yes``?

也就是說,如果我正在執行game_engine並且我的使用者自 memory-hog 以來沒有產生任何新程序game_engine,為什麼說game_engine總是成功地使我的系統處於無響應、不可恢復的狀態而沒有 OOM-killer 殺死它?


我以遊戲引擎為例,因為它們傾向於在我可憐的小集成卡上分配大量記憶體,但這似乎發生在許多資源密集型 X 程序中。

是否存在 OOM-killer 無效或無法撤銷程序記憶體的情況?

確實,OOM 殺手的最佳解決方案是沒有一個。將您的系統配置為不使用過度使用的記憶體,並拒絕使用依賴它的應用程序和庫。在無限磁碟的今天,為什麼不提供無限交換?除非使用記憶體,否則無需送出交換,對嗎?

您的問題的答案可能是 OOM 殺手並不像您認為的那樣工作。OOM 殺手使用啟發式方法來選擇要殺死的程序,並且規則並不總是意味著最後一個請求者死亡。參照。馴服OOM殺手。因此,這不是 OOM 殺手“無效”的問題,而是其中一個做出了您想要的選擇之外的選擇。

引用自:https://unix.stackexchange.com/questions/264149