web-dev-qa-db-ja.com

LinuxでOOMシナリオ(OOMキラーの背後にあるヒューリスティック)が存在する可能性はありますか?

私は仮想メモリの概念を知っています。また、デマンドページング(vm.overcommit_memoryによって異なります)を使用すると、使用可能なRAMよりも多くのメモリを割り当てることができます。ページを「タッチ」しない限り、実際には何も起こりません。それ以外の場合は、ページフォールトがあり、ページフレームに物理メモリが使用されていると思います。しかし、これはどういうわけか、システムがメモリに不足している場合、最後に最近使用したものをページアウトし、正常に動作することを意味します。

プロセスを強制終了する必要があるのはなぜですか? mlock()されたメモリが多すぎるために発生しますか?ゴミが多すぎるとOOMが呼び出されますか?または、別の質問をします。OOMキラーをトリガーする背後にあるヒューリスティックは正確には何ですか?

「echo1> memory.oom_control」または「echo-17>/proc/PID/oom_adj」を実行して無効にすることができると読みました。その意味は何ですか?マシンはおそらくしばらくの間完全に応答しなくなるでしょう。しかし、どういうわけか問題のあるプロセスが進行しないことを検出した場合、一時的にメモリの消費を停止する可能性があり(その速さ)、最終的にすべてが再び機能し始めるはずですか、それとも私は間違っていますか?

私のシナリオでは、プロセスは1つだけです(巨大なメモリ内キャッシュがあります)。もちろん、そのデータは永続的ではありませんが、それでもプロセスを再開したくない(そしてそのデータをリロードしたい)。

1
fiction

仮想メモリとオーバーコミットがどのように関連しているかについて混乱しているようです。

物理メモリは、コンピュータのRAMチップで構成されています。物理メモリよりも多くのメモリを同時に使用することは物理的に不可能です。しかし、1970年代後半以降、仮想メモリが存在し、システムは一部のデータを物理メモリからディスクに移動し、実際には使用されていないメモリを格納して、物理メモリを他の用途に使用できるようにします。これが発生すると、プログラムはスワップアウトされたデータをすぐに使用できません。とにかくそうしようとすると、プロセッサはページ障害を生成し、オペレーティングシステムに必要なデータをロードさせます。スワップから物理メモリに戻るデータ。

仮想メモリを使用することにより、使用可能な処理中のデータの合計量が、物理メモリとスワップスペースのサイズに拡張されます。これにより、システムは同時により多くのプログラムを実行できますが、実際に使用されているメモリの量は、使用可能な合計仮想メモリ(つまり、RAM +スワップスペース)

原則として、カーネルはプログラムがカーネルに要求したメモリの量を追跡する必要があり、すべてのメモリが割り当てられたことがブックキーピングによって通知されると、カーネルは追加のメモリの要求を拒否する必要があります、すべてが使用されたわけではありませんが。他のほとんどのカーネルはこれを行うため、OOMキラーはありません(必要がないため)。

ただし、カーネルからメモリを割り当てるプログラムのシステムコールは、バイト単位でメモリを割り当てません。それはより大きなブロックによってそれを割り当てます。対照的に、ほとんどのプログラムがメモリを取得するために使用する実際の実装(malloc() Cライブラリ関数)は、プログラムがバイト単位でメモリを割り当てることを許可します。これが意味することは、ほとんどのプログラムは、メモリを要求すると、実際に必要な量よりも多くをmalloc()割り当ててしまうということです。さらに、優れたmalloc()実装は、いくつかのヒューリスティックを使用して、小さい割り当てと大きい割り当てを別々に保つため、メモリの断片化は悪くありませんが、そうすると、カーネルからより多くのメモリを要求する必要があり、問題が悪化します。 。これらの影響やその他の影響の結果として、オーバーコミットせずに大量のメモリが割り当てられますが、使用されることはありません

オーバーコミットの考え方は、システムがバックファイアせずに使用できる仮想メモリの合計量よりもいくらか多くのメモリを安全に割り当てることができるということです。本質的に、カーネルは、知っていても、完全に実行する必要がないと仮定して、その約束を実行できないと主張します。それらの約束の範囲。ただし、問題が発生することなくオーバーコミット(割り当て)できる正確な量を予測することはできません。そのため、プログラムが割り当てられたすべてのメモリを使用しようとしていることをカーネルが検出すると、カーネルはその約束を更新する必要があります。これがOOMキラーの出番です。

それが良い考えかどうかは議論の余地があります。システムのメモリが不足すると、何かがうまくいかなくなります。それが、より多くのメモリを割り当てしようとしているが、カーネルがすでにすべてを予約しているアプリケーションの場合、その特定のアプリケーションがクラッシュする可能性があります。それがたまたまあなたのXサーバーであるなら、あなたは運が悪いです。少なくともOOMキラーが存在する場合は、割り当てが不適切なために問題が発生するのではなく、どのプロセスを強制終了するかを決定できます。 OOMキラーには、Xサーバーなどの重要なプロセスの強制終了を回避するためのロジックがいくつかあります...

ただし、必要に応じて、オーバーコミットをオフにするために使用できるsysctlノブがいくつかあります。これは、悪い考えだと思います。

2
Wouter Verhelst