OOMのキラーインターベンションを早期に行うことは可能ですか?


34

開発システムを最大限の信頼性に調整しようとしています。スワップを無効にしたのは、GUIを使用する場合、ほとんどの場合、マシンが応答しなくなり、使用できなくなるためです。それにもかかわらず、積極的なアプリケーションがメモリを使い果たした場合、速度を犠牲にしてそれを最大限に活用するメカニズムがいくつかあるようです。ハードドライブのスワップ操作はありませんが、システムは同様に応答しなくなります。そのため、システムがメモリゲインに特別な努力をする前に、OOMキラーを起動させたいと思います。たとえば、空きメモリが100 MB未満の場合に動作するようにOOMキラーを構成することは可能ですか?


2
ここでの本当の問題は、そもそも十分なRAMがないことだと思います。RAMがなければスワップは使用しません。スワップをオフにすると、RAMが不足し、ページングする場所がなくなります。いことが起こります。システムの設定が不適切であるように思われますが、それを修正する量はありません。
ジャーニーマンオタク

8
私は同意しません。開発と「電力使用」には、多くの場合、実験的な使用が含まれます。たとえば、コマンドラインの画像処理ツールを使用する場合、画像サイズに関連して操作に必要なメモリの量に関する仕様はありません。だから私はそれを実行します。そして、マシン全体が役に立たなくなるとは思わない。単一の実験では、ulimitを使用してセキュリティを維持できますが、システム全体の操作では、多くの操作が行われることがあるため、1つのプロセスを封じ込めることはあまり有用ではありませんが、マシン全体の「生命保険」は明確に役立ちます。
ドロヌス

1
スワップの使用時にシステムが停止するという事実は疑わしいです。お使いのコンピューターがスワップを使用していると、メモリーが不足します。スワップが遅くなり、ディスクアクセスが遅くなります。???のためにディスクアクセスが遅くなります。その問題はずっと下にあります。ラムが少ないというだけではありません。それはあなたが何か他のもののためにそれをmitgateするために1つの方法を使用できないことです。
ジャーニーマンオタク

7
@JourneymanGeek、あなたは左のフィールドでオフです。ディスクはRAM期間と比較して遅いため、スワッピングを頻繁に行うとシステムは常に停止します。もちろん、彼は多くのメモリを使用するプログラムを実行しようとしたため、メモリ不足です。問題は、メモリ不足のときに何をすべきかということです。豚を殺すか、ディスクキャッシュ用のメモリが残っていないためにスローダウンします。
-psusi

2
@TomWijsman、ディスクIOはメモリIOよりも桁違いに遅いため、ディスクスワップを使用することは常に大きな速度低下を意味します。時々(特にramが高価で、ほとんどの人があまり持っていなかった昔)、それはあなたがしようとしていたことを全くできないことが望ましいです。このごろディスクがあるSOはるかに遅いラムよりも、そしてラムは、ほとんどの人はそう、彼らは誤って多くの用途は、彼らが持っているよりもラムことを何かを実行するまれな機会に、たくさん持っていることを安価に十分である、それはテイク1000年よりもあきらめるほうが良い場合が多いですそれをするのに何倍も。
-psusi

回答:


36

私もその問題に苦労しました。システムの応答性を維持したいだけで、数分待つよりもプロセスを失う方が好きです。カーネルoomキラーを使用してこれを達成する方法はないようです。

ただし、ユーザー空間では、何でもできます。だから私は初期のOOMデーモン(https://github.com/rfjakob/earlyoomを書きました、使用可能なRAMが10%を下回ると、最大のプロセス(RSSによる)を)を作成しました。

earlyoomがなければ、http://www.unrealengine.com/html5/を数回起動することで、マシン(8GB RAM)を簡単にロックできました。現在、有罪のブラウザのタブは、物事が手に負えなくなる前に殺されます。


3
このかゆみを傷つけてくれてありがとう!これまでの早い段階での愛情。
トーマスフェリスニコライセン

1
Androidが長い間同じことをしていることがわかりました。そのためにあなたのようなカスタムコードを使用しているかどうかはわかりません。
ドローヌス

1
私はearlyoom今テストしていますが、最初のトリガーテストでうまくいきます。カーネル構成またはシステムツールでこれを実装できないのはなぜかと思います。
ドローヌス

12

カーネルのデフォルトポリシーは、空き物理メモリがある限り、アプリケーションが仮想メモリを割り当て続けることを許可することです。物理メモリは、アプリケーションが割り当てた仮想メモリに触れるまで実際には使用されないため、アプリケーションはシステムが持っているよりもはるかに多くのメモリを割り当ててから、後で触れ始めると、カーネルがメモリ不足になり、メモリ不足を引き起こしますメモリ(OOM)キラー。ホギングプロセスが終了する前に、ディスクキャッシュが空になり、キャッシュがいっぱいになるまでシステムの応答がしばらく遅くなります。

2の値をに書き込むことにより、メモリのオーバーコミットを許可しないようにデフォルトポリシーを変更できます/proc/sys/vm/overcommit_memory。デフォルト値/proc/sys/vm/overcommit_ratioは50であるため、カーネルはアプリケーションがram + swapの50%以上を割り当てることを許可しません。スワップがない場合、カーネルはアプリケーションがRAMの50%以上を割り当てることを許可せず、残りの50%をキャッシュに残します。それは少し過剰かもしれませんので、この値を85%程度に増やして、アプリケーションがRAMの最大85%を割り当て、15%をキャッシュに残せるようにすることができます。


1
理論的背景のないデフォルトからこれらの値を変更しても、より信頼性の高いシステムには到達しません。適切な統計でのみその変更を正当化できます。変更できるからといって、変更する必要があるわけではありません。常に低メモリ状態にあるため、現在よりも多くのメモリを使用しているため、メモリを追加購入する必要がある場合、設定をいじってランダムなアプリケーションを強制終了する必要はありません。...本当に進むべき道ではありません、あなたの毎日の作業や導入汚職、と中断
タマラWijsman

3
@TomWijsman、この質問は、彼が常に低メモリ状態にいるわけではないことを明らかにしています。彼は時々、予想外に大量のメモリを使用するコマンドを実行するだけです。使い果たした場合、メモリを購入することだけが解決策ではありません。他の潜在的な解決策には、所有しているメモリを利用するより良い方法を見つけること、またはそのようなメモリを必要とするものを何もしないことなどがあります。質問は、後者が外出してより多くのラムを購入するよりも受け入れられることを明らかにします。
-psusi

質問のどの行がこれを明確にしていますか?私は反対に与えられたを参照してくださいI disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.。あなたは彼がコマンドを実行すると仮定している間、彼はGUIに言及しました。より多くのメモリを購入することが最初の解決策であり、自分でより少ないメモリを使用することが2番目の解決策であり、安定したデフォルトをいじってシステムを不安定にすることが最後の解決策です。質問に文字通り答える必要はありませんので、コメントで私たちの両方を悩まさなければならないあなたの問題は何なのかわかりません。暴言は助け...ない
タマラWijsman

4
ねえ、この答えはとてもクールに聞こえました。残念ながら、「コミット」とは、仮想メモリの需要を指します。これは、アプリケーションプログラマーにとっては非常に悪い評価です。たとえば、(スワップなしの)デスクトップを実行している場合、2000 MBの物理メモリのうち約400が使用されますが、1600 MB /proc/meminfoCommitted_AS状態として「コミット」されます。一部のアプリケーションが実行されている場合、この値は物理メモリを簡単に超えるため、これで実行可能な制限を設定することは困難です。
ドロヌス

3
これを試す前に作業を保存してください!:PIは、すべて(bash、ウィンドウマネージャーなど)から即座に失敗しました。
jozxyqk

8

私にとっては、vm.admin_reserve_kbytes = 262144を設定すると、まさにこれが行われます。OOMキラーは、システムが完全に応答しなくなる前に介入します。


1
アイデアは好きですが、256MiBの物理メモリを使用したことがないということですか?
ジェロームプイエ

1
キャッシュには256MiBが使用されます。キャッシュは本当に重要です。それは単に高速で実行することではなく、キャッシュに十分なメモリがなければシステムはまったく動作しません。実行中のすべてのプログラムのコードは、mmapされており、ディスクから読み戻すことができるため、メモリからアンロードできます。キャッシュがないと、すべてのタスクスイッチでディスクの読み取りが必要になり、システムが完全に応答しなくなります。
マイケルヴィゴフスキー

4

他の回答には優れた自動ソリューションがありますがSysRq、手に負えなくなったときにキーを有効にすることも役立つと思います。ではSysRqキーは、手動でカーネルをメッセージングするだろう、とあなたが(安全な再起動のようなものを行うことができますSysRQ + REISUBユーザ空間が完全に凍結した場合であっても)。

カーネルがリクエストをリッスンできるようkernel.sysrq = 1にするには、ビットマスクで使用する可能性の高い機能のみを設定または有効にします(ここで説明します)。たとえば、kernel.sysrq = 244上記の安全な再起動に必要なすべてのコンボと、OOMキラーの手動呼び出しを有効にしSysRq + Fます。


-2

低メモリ状態とOOMキラーでは信頼性に達しません。

パーティをクローゼットで整理し、小さなプレイリストにクローゼットを整理する」というのは間違っています。

OOMのキラーインターベンションを早期に行うことは可能ですか?

何を殺すかを制御できないため、これを行うと意図しない副次的な結果が生じます。

開発システムを最大限の信頼性に調整しようとしています。

最大の信頼性にはテストが含まれます、システムのとこれらのテストに基づいたシステムの改善ます。

ランダムなものを微調整するだけではどこにも行きません...

スワップを無効にしたのは、GUIを使用する場合、ほとんどの場合、マシンが応答しなくなり、使用できなくなるためです。それにもかかわらず、積極的なアプリケーションがメモリを使い果たした場合、速度を犠牲にしてそれを最大限に活用するメカニズムがいくつかあるようです。

メモリ不足の条件に、挙動を改善しませんスワップを無効にするそれが反対の動作をし

この状況で信頼性を高めるには、システムの応答性を高め、ユーザーの意図なしにランダムプロセスが強制終了されないように、メモリを追加します。特に開発環境ではなく、低メモリ状態とこのようなメカニズムに頼るべきではありません...

ハードドライブのスワップ操作はありませんが、システムは同様に応答しなくなります。

スワップがあるかどうかにかかわらず、メモリ不足の状態は実際に無反応になります。

そのため、システムがメモリゲインに特別な努力をする前に、OOMキラーを起動させたいと思います。

上で説明したように、善よりも害をもたらす特別な努力。代わりに、自分で必要のないプロセスを強制終了することもできますが、OOMが必要なプロセスを強制終了するので、それはできないと思います。

たとえば、空きメモリが100 MB未満の場合に動作するようにOOMキラーを構成することは可能ですか?

そうかもしれませんが、最近はあまりコストがかからないメモリを追加購入するだけで、投資収益率が高くなります。低メモリ状態で作業を続けると、長い目で見れば自分で足を踏み入れることになると考えてください。OOMは執行官のようなもので、あなたを助けません、OSを助けます...


7
もちろん、スワップを無効にすると、OOMがディスクをスラッシングする代わりに、メモリホグを開始して強制終了するため、動作が改善されます。RAMを使い果たすことは問題ではありません(さらに追加することは、実行するためにもっと努力する必要があることを意味します)。問題は、実行したときに何をすべきかです。OOMが豚を殺して、メモリ不足の状態を緩和するようにします。
-psusi

7
なぜなら、あなたが持っているよりも多くのメモリを使用しようとしているアプリケーションを殺すことは、システム全体をひざまずかせることよりも望ましいからです。完璧な世界では、無制限のメモリがあり、決して使い果たすことはありませんが、実際には、偶然に使い果たして、システムを停止させるよりも「メモリ不足」と言われることがあります。
-psusi

5
追加のメモリを購入すると、購入した量によっては問題が解決する場合があります。ただし、予期しない使用法が数桁あるという事実は変わりません。そのため、アプリケーションは失敗しますが、そのような状況ではシステムは失敗しません。いくつかの例:圧縮された画像でいっぱいのフォルダーを処理します。それらのほとんどは「通常」サイズですが、一部は非常に大きくなります。小さなミスは、1GB /秒を消費するメモリ暴走でデッドループを作る可能性があります。誤ってテキストエディターでビデオファイルを開きます。。でOOMキックまでぎくしゃくマウスとほとんど死んUIのような症状を持つ通常この両端
dronus

6
@TomWijsmanには、入力データに応じて、平均では線形ですが、最悪では指数関数的に動作するアルゴリズムがあるため、ほとんどデッドループもあります。また、マウスがぎくしゃくしてクリックし、キーボード入力に1分の待ち時間が表示される場合、キル信号を送信できません。私は通常、テキストモードのターミナルに切り替えて、kill盲目的にタイプされたものを発行するためだけにログインが進むのを数分間待ちます。
ドロヌス

7
死んでしまうアプリケーションを殺すことにも問題はありません。2GB物理+ 2GBスワップのシステムを検討してください。物理メモリをすぐに使い果たすアプリケーションは、スワップも簡単に食い尽くしてしまいます。システムが数分から数時間応答しなくなった後、すぐに死んでしまいます。それでは、GUI操作が不安定になる前に、すぐにそれを強制終了してみませんか?多くのプロセスはすべての作業を10 MBで行い、一部のプロセスは1 GBを使用し、一部のプロセスは10 GBを必要とします。
ドロヌス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.