できる。
Linuxで発生する可能性のある2つの異なるメモリ不足状態があります。発生するものはsysctl vm.overcommit_memory
(/proc/sys/vm/overcommit_memory
)の値によって異なります
はじめに:
カーネルは、いわゆる「メモリーオーバーコミット」を実行できます。これは、カーネルがシステムに実際に存在するよりも多くのメモリをプログラムに割り当てる場合です。これは、割り当てられたすべてのメモリをプログラムが実際に使用しないことを期待して行われます。これは非常に一般的な現象です。
overcommit_memory = 2
ときovercommit_memory
に設定され2
、カーネルはまったくオーバーコミットを実行しません。代わりに、プログラムにメモリが割り当てられると、そのメモリを持っていることが保証されます。システムに割り当て要求を満たすのに十分な空きメモリがない場合、カーネルは要求に対して失敗を返すだけです。状況を適切に処理するのはプログラム次第です。本当に失敗したときに割り当てが成功したことを確認しない場合、アプリケーションはしばしばセグメンテーション違反に遭遇します。
セグメンテーション違反の場合、次のような行が出力に表示されdmesg
ます。
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
これat 0
は、アプリケーションが初期化されていないポインターにアクセスしようとしたことを意味します。これは、失敗したメモリー割り当て呼び出しの結果である可能性があります(しかし、これが唯一の方法ではありません)。
overcommit_memory = 0および1
ときovercommit_memory
に設定されている0
か1
、オーバーコミットが有効になり、プログラムが実際に利用可能であるよりも多くのメモリを割り当てることが許可されています。
ただし、プログラムが割り当てられたメモリを使用したいが、カーネルが実際にそれを満たすのに十分なメモリがないことを発見した場合、いくらかのメモリを取り戻す必要があります。最初に、キャッシュのフラッシュなど、さまざまなメモリクリーンアップタスクを実行しようとしますが、これが十分でない場合、プロセスを終了します。この終了は、OOM-Killerによって実行されます。OOM-Killerはシステムを調べて、どのプログラムがどのメモリを使用しているのか、どのくらいの時間実行されているのか、誰がそれらを実行しているのか、そしてどのプログラムが殺されるかを決定する他の多くの要因を確認します。
プロセスが強制終了された後、使用していたメモリが解放され、メモリ不足状態を引き起こしたプログラムに必要なメモリが確保されます。
ただし、このモードでも、プログラムは割り当て要求を拒否できます。ときovercommit_memory
で0
、カーネルは、それが割り当て要求を拒否し始める必要がある場合に最良の推測を取るしようとします。に設定されている1
場合、要求をいつ拒否するかを決定するためにどの決定を使用するかわかりませんが、非常に大きな要求を拒否することができます。
OOM-Killerが関係しているかどうかは、の出力を見て、次のdmesg
ようなメッセージを見つけることで確認できます。
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB