OOM-Killerが、あまりにも多くを要求するプロセスを強制終了できないのはなぜですか?


12

ここでは、OOM-Killerを介して設定できることovercommit_memory、および次のことを説明します

  • 2 =オーバーコミットなし。あまりにも多くを求める場合、割り当ては失敗します。
  • 0、1 =オーバーコミット(ヒューリスティックまたは常に)。殺すいくつかあまりにも多くのメモリが実際にアクセスしたときに、いくつかの経験則に基づいたプロセス(複数可)。

今、私はそれを完全に誤解しているかもしれませんが、割り当てられたメモリに実際にアクセスしようとするプロセスを強制終了するオプションがないのはなぜですか(またはなぜデフォルトではないのですか)?


重要なシステムプロセスが大量のメモリを要求した場合はどうなりますか?
ローレンス14年

そもそも-それはこのことをすることができます。しかし、その質問の最大の問題は、おそらくプロセスがメモリを要求している場合、新しく実行されていることです-つまり、これは非常に現在の処理に関係する新しいプロセスです。OOMで、3日間未開封のimクライアントにシステムメモリの浪費を許可してもらえますか、それともYouTubeが今年実際にロードするのでしょうか。linuxatemyram.com
mikeserv

3
これは、no overcommitオプションが本質的に行うことです。プロセスが大量のメモリを要求すると、失敗します。エラーをチェックすると、通常は自身を強制終了します。そうでない場合、malloc()返されるヌルポインターを逆参照しようとすると、おそらくセグメンテーションエラーが発生し、クラッシュします。
バーマー14年

no overcommit引用されたソース(kernel.org/doc/Documentation/vm/overcommit-accountingなど)によると、実際には2がモードであることに注意してください。それに応じて質問を編集します。
hans_meine

回答:


24

このシナリオを考慮してください:

  • 4GBの空きメモリがあります。
  • 障害のあるプロセスは3.999GBを割り当てます。
  • タスクマネージャを開いて、暴走プロセスを強制終了します。タスクマネージャは0.002GBを割り当てます。

強制終了されたプロセスがメモリを要求する最後のプロセスである場合、タスクマネージャは強制終了されます。

または:

  • 4GBの空きメモリがあります。
  • 障害のあるプロセスは3.999GBを割り当てます。
  • タスクマネージャを開いて、暴走プロセスを強制終了します。Xサーバーは0.002GBを割り当てて、タスクマネージャーのウィンドウを処理します。

これで、Xサーバーが強制終了されます。問題は発生しませんでした。それはただ「間違った時間に間違った場所に」いた。たまたま残っているメモリがなかったときにメモリを割り当てる最初のプロセスでしたが、すべてのメモリを使用して開始したプロセスではありませんでした。


あなたの例を拡張すると、プロセスがあなたのメモリの99.999%を消費している場合、それを殺すことができるものはメモリを必要とし、したがって誤ったプロセスが殺される前にそれ自体が殺されるので、あなたはそれを殺すことができません!
そり14年

13
これはLinuxの哲学であり、必要な事実ではありません。Windows 3.0は、必要なダイアログを含め、OOM処理用に十分なメモリを確保することでそれを解決しました。
MSalters 14年

@MSalters:ただし、実際にはこの例には当てはまりません。例は、ほぼすべてのメモリを予約したプロセスに関するものでした。OOMを強制終了するには不十分です。明らかに、OSでのOOM処理のために十分なメモリを確保する必要があります。しかし、OOM処理を呼び出すプロセスは、メモリを予約する次のプロセスであり、不正な動作ではありません。もちろん、Windows 3.0が常にタスクマネージャーを実行するために十分なメモリを確保していること、またはOOMハンドラーが常にプロセスを強制終了するようにユーザーに促すことを意味している場合を除きます。(!=違反プロセスを殺す)
アレクシトルハモ

3
@AleksiTorhamo:確かに後者を意味していました。Windows 3.0には本格的なタスクマネージャがなく、メモリが事前に割り当てられた有名なブルースクリーンがありました。
-MSalters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.