web-dev-qa-db-ja.com

OOMキラーが適切に機能せず、OSがフリーズする

何年もの間、私のオペレーティングシステムの OOM killer が適切に機能せず、システムがフリーズします。
メモリ使用量が非常に多い場合、システム全体が(=のために極端に遅くなる)「=」になる傾向がありますhoursまたはdays、プロセスを強制終了してメモリを解放する代わりに。
私が記録した最大値は、リセットを操作するために自分を辞任する7日前です。
OOMに到達しようとすると、iowaitが測定不能になる前に非常に高くなります(〜70%)。
ツール:iotopは、すべてのプログラムがハードドライブから非常に高いスループット(数十MB /秒あたり)で読み取りを行っていることを示しています。
それらのプログラムは何を読んでいますか?
-ディレクトリ階層?
-実行可能コード自体?
正確には今はわかりません。

[編集]このメッセージを書いたとき(2017年)、私は最新のArchLinux(4.9.27-1-lts)を使用していましたが、何年も前からこの問題を経験していました。
さまざまなLinuxディストリビューションと異なるハードウェア構成で同じ問題が発生しました。
現在(2019)、最新のDebian 9.6(4.9.0)を使用しています16 GBの物理RAM、SSD私のOSがインストールされており、swapパーティションではありません。

私が持っているRAMの量のために、問題の出現を遅らせるだけなので、スワップパーティションを有効にしたくありません。
また、SSDを頻繁に交換すると、ディスクの寿命が短くなる可能性があります。
ちなみに、私はすでにスワップパーティションを使用して、または使用せずに試しましたが、問題の出現を遅らせるだけで、解決策ではないことが証明されています。

私にとって問題は、Linuxがcachesから重要なデータを削除するという事実によって引き起こされます。ハードドライブからの時間。

Linuxが実行中のプログラムの実行可能コードページをドロップしないのかどうかさえ疑問です。これは、通常、多くのデータを読み取らないプログラムがこの状況でこのように動作する理由を説明します。

私はこの問題を修正するためにいくつかのことを試みました。
1つは、/proc/sys/vm/min_free_kbytes1000000(1 GB)に設定することでした。
この 1 GB は空のままにしておく必要があるため、このメモリはLinuxによって予約され、重要なデータをキャッシュすることになると思いました。
しかし、うまくいきませんでした。

また、理論的には素晴らしいように聞こえるかもしれませんが、/proc/sys/vm/overcommit_memory2に定義することによって仮想メモリのサイズを物理メモリのサイズに制限することは、技術的にまともではないことも付け加えておきます私が使用する種類のアプリケーションは、何らかの理由で実際に使用するよりも多くの仮想メモリを必要とするため、私の状況では可能です。
ファイル/proc/meminfoによると、Commited_ASの値は、多くの場合、システムの物理RAMの2倍よりも高くなっています(16 GB、 Commited_AS は32 GBを超えることが多い)。

/proc/sys/vm/overcommit_memoryをデフォルト値の0に設定してこの問題を経験しました。しばらくの間、1に定義しました。これは、 OOM killer は、割り当てが拒否されたときにmallocの戻り値をチェックしないため、誤って動作するのではなく。

[〜#〜] irc [〜#〜] でこの問題について話していたとき、これと同じ問題を経験した他のLinuxユーザーに会ったので、多くのユーザーがこれを心配しています。
Windowsでも高いメモリ使用量を扱うので、これは受け入れられません。

さらに情報が必要な場合は、提案があれば教えてください。

ドキュメンテーション:
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/

彼らはそれについて話します:
なぜLinuxのメモリ不足(OOM)キラーが自動的に実行されず、sysrq-keyで機能するのですか?
OOM-killerがリソースホグの削除に失敗することがあるのはなぜですか?
OOMキラーのプリロード
強制スワッピングでOOMキラーをトリガーすることは可能ですか?
OOM状況の近くで高遅延を回避する方法?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=23384

28
M89

理由について2つの説明(同じことについて)が見つかりました kswapd0は OOM-killerが問題のプロセスを強制終了する前に、一定のディスク読み取りが発生します

  1. このaskubuntu SEの回答とコメントを見る
  2. 答えと、Unix SEでの この答えに関するDavid Schwartzのコメントをご覧ください

ここで、1からのコメントを引用します。これにより、すべてが frozen であるにもかかわらず、ディスクの読み取りが継続的に行われる理由が本当にわかりました。

たとえば、スワップがゼロで、システムのRAMがほぼ不足している場合を考えます。カーネルは、たとえばFirefox(これは、Firefoxがディスクからロードされた実行可能コードを実行しているために実行できます。必要に応じて、コードをディスクから再度ロードできます)。 FirefoxがそのRAM=再びN秒後にアクセスする必要がある場合、CPUは「ハードフォールト」を生成し、Linuxに強制的に一部のRAMを解放させます(たとえば、 RAM別のプロセスから)、不足しているデータをディスクからロードし、Firefoxが通常どおり続行できるようにします。これは通常のスワッピングと非常に似ており、kswapd0がそれを行います。– Mikko Rantalainen 2月15日13:08

誰かがこの動作を無効にする方法を持っている場合(たぶん どのオプションでカーネルを再コンパイルしますか? ))、できるだけ早く私に知らせてください!感謝します!

UPDATE:これまでに見つけた唯一の方法は、カーネルにパッチを当てることであり、スワップを無効にして動作します(つまり、CONFIG_SWAP is not set)しかし、スワップが有効になっている他の人には機能しません seems ; this 質問内のパッチを参照してください。

7
user306023

memory.minパラメータcgroups-v2メモリコントローラが役立つはずです。

つまり、引用させてください:

ハードメモリ保護。 cgroupのメモリ使用量がその有効最小境界内にある場合、cgroupのメモリはどのような状況でも回収されません。保護されていない再生可能なメモリが利用できない場合、OOMキラーが呼び出されます。

ソース: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html

0