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


25

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

今後これを防ぐにはどうすればよいですか?少なくともレスポンシブコアまたは何かを実行し続けることはできませんか?


回答:


15

システムは実際には(カーネルがハングしたという意味で)「フリーズ」せず、むしろ非常に応答しなかったに違いありません。おそらく、非常に激しく交換するだけで、インタラクティブなパフォーマンスとシステムスループットが石のように低下​​する可能性があります。

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

代わりに、プロセスごとのリソース制限(一般にrlimitandまたはor と呼ばれるulimit)を使用して、1つのプロセスがとんでもない量のメモリを使用してスワッピングを引き起こす可能性を削除できますが、それにより、システムが提供するよりも少し多くのメモリが必要だったため、不便な瞬間がありました。

大量のメモリ使用量を引き起こす可能性のあることを行うとわかっている場合は、おそらくmlockall()シェルプログラムを実行してからシェルを実行するラッパープログラムを作成できます。それはメモリ内に保持し、取得する可能性が高い「応答性の高いコアを維持する」ことに最も近いものになります(CPUが過剰に使用されていることが問題ではないため)。

個人的に、私はリソース制御の「愚かなことをしないでください」メソッドにサブスクライブします。あなたがルートを持っている場合は、システムへの損傷のすべてのソートを行うには、そうすることができます何でもあなたは危険なビジネスである可能性の高い結果を知らないということを。


2
残念ながら、「愚かなことをしないでください」は、Chromeのようなメモリを大量消費するアプリケーションを実行しているユーザーには役立ちません(問題134612、393395を参照)。
ダンダスカレスク

1
@DanDascalescuそして、あなたが何か愚かなことをしていることは必ずしも明白ではありません。先日、(複雑な)SQLiteクエリの「UNION」を「UNION ALL」に変更したため、マシンがハングしました。
マイケル

既知のバグのあるプログラムは、リソースに制約のある構成で実行できます(また、実行する必要があります)ulimit。クリティカルではない環境でクエリの効果を検証せずに運用環境でクエリを変更する場合、それが根本的な問題です。
ワンブル

8

Tronicのコメントで前述したように、キーボードの組み合わせSysRq-で直接OOM-killer(out of memory killer)を呼び出すことができFます。

SysRqキーは通常PrtSc、キーボードのキー内で結合されます。

OOM-killerはいくつかのプロセスを強制終了し(-es)、システムは再び応答します。OOM-killerへの直接アクセスはデフォルトでは有効になっていない可能性があります。この質問をチェックアウトし、ステータスの確認方法や有効化方法を確認してください。

PS:これはとても助かりました。これは、Chromeやメモリ欲張りソフトウェアが原因である場合、これがその問題に関する最も有用なアドバイスであるという意見に同意します。しかし、OOM-killerはいくつかの本当に重要なプロセスを殺す可能性があることに注意してください。慎重に使用してください。



0

カーネルを再コンパイルしたい場合は、この質問のセクションからパッチを試すことができますEDIThttps : //stackoverflow.com/q/52067753/10239615高いメモリ圧迫時
Active(file)ページを排除しないため、OOM-killerが許可されますカーネルは、OSのフリーズの原因となるすべてのプロセスの実行可能コードページのディスクからの一定の再読み取りに数分を費やす必要がなくなるため、ほぼ瞬時にトリガーします。


-1

これは特に防ぐのが難しいものです。カーネルがスワッピングを開始するためです。1つの解決策は、スワップをオフにすることです。スワップを開始するのではなく、システムのメモリが不足すると、カーネルはいくつかのプロセスを強制終了します。通常、正しいプロセスを選択して強制終了しますが、応答しないシステムを使用するよりも、ランダムプロセスを強制終了する方が適切です。

サーバーには十分なRAMがあり、スワップスペースを使用し始めると、とにかく何かが間違っていることを意味するため、これはサーバーにとって特に優れたソリューションとなります。ただし、デスクトップには通常スワップスペースが必要なので、デスクトップに適したソリューションはないと思います。特にメモリリークの疑いがある場合は、サーバーのスワップスペースをオフにします。


4
どのシステムでもスワップをオフにするのは悪い考えです。これは、未使用のページをスワップアウトしたり、ディスクキャッシュに使用する空き領域を許可したりしないためです。これは、メモリリークがある場合に特に当てはまります。
ワンブル

2
また、スワップをオフにしても、ページングが原因でシステムの速度が低下する可能性があります。汚れたページではなく、きれいなページをページングするだけです。(スワップなしでは、ダーティページを排除できないため、常にクリーンページを排除する必要があります。)
デイビッドシュワルツ

サーバーにメモリリークがあります。サーバーが応答しなくなったため、最初に起こったときにリセットボタンを押す必要がありました。しかし、スワップをオフにしたので、サーバーはapacheの子が大きくなりすぎた場合にそれを強制終了します(MaxRequestsPerChildに加えて安全対策です)。その結果、サーバーは問題なく実行されます。とにかく多くの未使用ページはありませんし、クリーンなページを狂ったようにページングしているわけでもありません。
アントニ

@AntonisChristofides:テイクアウトの教訓が何だと思うかわかりません。ソリューションは確かに悪いものです。物理メモリからアクセス頻度の低いダーティページを排除できないためパフォーマンスが低下し、根本的な問題を解決できず、OOMキラーが重要なプロセスを強制終了するリスクが発生するためです。私が警告していた特定の危険に遭遇することはありませんでしたが、スワップがないため、危険にさらされています。
デビッドシュワルツ

8
スワップの有無にかかわらず、OOMキラーが自動的に実行される前にフリーズします。これは実際には修正すべきカーネルのバグです(つまり、すべてのディスクキャッシュを削除する前に、OOMキラーを早めに実行してください)。残念ながら、カーネル開発者や他の多くの人々は問題を認識できません。スワップの無効化/有効化、RAMの追加、プロセスの実行、制限の設定などの一般的な提案は、カーネルの低メモリ処理がラクダの玉を吸うという根本的な問題に対処していません。その間、システムがフリーズしたときにOOMキラー(SysRq-F)を手動で実行することをお勧めします。
Tronicの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.