web-dev-qa-db-ja.com

メモリ不足のときにLinuxがフリーズしないようにするにはどうすればよいですか?

今日、私は(偶然にも)Linuxボックスでいくつかのプログラムを実行して、すぐに大量のメモリを使用しました。システムがフリーズし、応答しなくなったため、犯罪者を殺すことができませんでした。

どうすれば将来これを防ぐことができますか?少なくともレスポンシブコアなどを実行し続けることはできませんか?

25
johv

システムが実際に(カーネルがハングしたという意味で)「フリーズ」していなかったのではなく、非常に無反応だったに違いありません。交換が非常に難しいため、インタラクティブなパフォーマンスとシステムのスループットが急激に低下した可能性があります。

あなたcouldスワップをオフにしますが、それは問題をパフォーマンスの低下からOOMで強制終了されたプロセス(および原因となるすべての楽しみ)に変えるだけでなく、ディスクキャッシュの使用量が少ないためにパフォーマンスが低下します。

または、プロセスごとのリソース制限(一般にrlimitulimitと呼ばれる)を使用して、1つのプロセスがとんでもない量のメモリを使用してスワップを引き起こす可能性を取り除くことができますが、システムが提供するよりも少し多くのメモリを必要としていたために、不都合な瞬間に死ぬプロセスであなたを面白い領域に押し込むだけです。

大量のメモリを使用する可能性があることを実行することがわかっている場合は、mlockall()を実行するラッパープログラムを記述してから、シェルを実行することができます。それはそれをメモリに保持し、あなたが得る可能性が高い「レスポンシブなコアを維持する」に最も近いものです(それが問題であるのはCPUが過剰に使用されていることではないためです)。

個人的には、私はリソース制御の「愚かなことをしない」方法に加入しています。ルートを取得している場合、システムにあらゆる種類の損害を与えることができます。そうすることでanythingを実行すると、リスクのあるビジネスである可能性のある結果がわかりません。

15
womble

上記のTronicによるコメントで述べたように、キーボードの組み合わせで直接OOMキラー(メモリ不足キラー)を呼び出すことができます。 SysRq-F

SysRq キーは通常、 PrtSc キーボードのキー。

OOMキラーは一部のプロセスを強制終了し(-es)、システムは再び応答可能になります。 OOM-killerへの直接アクセスはデフォルトでは有効になっていない可能性があります。plzcheckout この質問 は、そのステータスをチェックしたり有効にしたりする方法を見つけます。

PS:これは私を大いに助けました。 Chromeまたはその他のメモリ貪欲なソフトウェアによって引き起こされた場合、これがその問題について最も有用なアドバイスであるという意見に同意します。しかし、OOM-killerがいくつかの本当に重要なものを殺す可能性があることを覚えておく必要がありますプロセス、慎重に使用してください。

8
Arkemlar

これは2007年以降知られているバグです メモリ使用量が多いとシステムがフリーズする を参照してください。

この場合、Windowsは、ユーザーに1つ以上のアプリケーションを閉じるよう警告するダイアログを表示します。

1
Dan Dascalescu

カーネルを再コンパイルしたい場合は、この質問のEDITセクションにある patch を試してください: https://stackoverflow.com/q/52067753/10239615
メモリの負荷が高いときにActive(file)ページを削除せず、カーネルがディスクからの一定の再読み取りに数分を費やす必要がないため、OOMキラーがほぼ瞬時にトリガーできるようにします。すべてのプロセスの実行可能コードページのうち、OSがフリーズします。

0
user483652