
如果我在 shell 中輸入x=`yes`
,最終我會得到,cannot allocate 18446744071562067968 bytes (4295032832 bytes allocated)
因為yes
嘗試寫入x
永遠,直到記憶體耗盡。我收到一條訊息,cannot allocate <memory>
因為內核的 OOM-killer 告訴我xrealloc
沒有更多的位元組可以分配,並且它應該立即退出。
但是,當我game_engine
因為資源不足而要求任何人分配更多不存在的圖形記憶體時,它會轉向我的 RAM 和 CPU 來分配所要求的記憶體。
為什麼核心的 OOM-killer 沒有捕獲任何game_engine
分配大量記憶體的嘗試,就像它所做的那樣x=`yes`
?
也就是說,如果我正在運行game_engine
,並且我的用戶自 memory-hog 以來沒有生成任何新進程game_engine
,為什麼 saidgame_engine
總是成功地使我的系統陷入無響應、不可恢復的狀態,而不會被OOM-killer殺死?
我使用遊戲引擎作為示例,因為它們傾向於在我可憐的小集成卡上分配大量內存,但這似乎發生在許多資源密集型 X 進程中。
是否存在 OOM-killer 無效或無法撤銷進程記憶體的情況?
答案1
事實上,針對 OOM 殺手的最佳解決方案就是不擁有它。將您的系統配置為不使用過度使用的內存,並拒絕使用依賴它的應用程式和庫。在這個無限磁碟的時代,為什麼不提供無限的交換呢?除非記憶體被使用,否則不需要提交交換,對嗎?
您的問題的答案可能是 OOM 殺手並不像您想像的那樣工作。 OOM 殺手使用啟發式方法來選擇要終止的進程,規則並不總是意味著最後一個請求者會終止。比照。馴服 OOM 殺手。因此,這並不是 OOM 殺手「無效」的問題,而是其中一個做出了與您想要的不同的選擇。