web-dev-qa-db-ja.com

メモリが不足するとシステムがハングする

私はeeePC 900aを持っています。ディスクとして8GBのフラッシュと1GBのRAMしかありません。インストールされているLinuxディストリビューションはArchLinuxです。

システムのメモリが不足すると、システムは非常に無応答になります。TTY1に切り替えたり、マウスポインターを移動したりするのに数秒/分かかります。時々、システムがフリーズするように見えることがあります。3つ前に私はそれを放置しましたが、今のところ何も変更されていません。

このeeePCでスワップパーティション/ファイルを作成することは避けたいと思います。これは、ディスクが既に小さいため、また、スワップスペースへの書き込みが多いと、フラッシュカードの寿命が大幅に短くなるためです。さらに、スワップファイル/パーティションは問題を確実に修正するのではなく、単に移動するだけだと思います。

カーネルは、メモリが不足すると、ランダムなアプリケーションを強制終了するはずではありませんか?なぜそれが失敗するのですか(または時間がかかるのですか?)

数か月/年前に、私はすでにこれをさらに詳しく調べようとしましたが、実際に機能するものを見つけることができませんでした...

37
peoro

最近、問題の解決策を見つけました。

Linux OOMキラーはその仕事を適切に行うことができないので、私はユーザースペースOOMキラーを使用し始めました: earlyoom 。それはCで書かれており、かなり構成可能で、私にとっては魅力のように機能しています。

サーバーで実行するために開発された FacebookのOOMD などの代替案についても聞いたことがありますが、これは試していません

7
peoro

キーボードの組み合わせでOOMキラー(メモリキラー不足)を直接呼び出すことができます。

SysRq-F

SysRqキーは通常、キーボードのPrtScキーに組み込まれています。

OOMキラーは一部のプロセスを強制終了し(-es)、システムは再び応答可能になります。

Thx Ramanによる上記のコメントでのこの機能に関するアドバイス

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

15
Arkemlar

本来の状態では、アプリケーションデータはRAMにあり、ファイルはディスク上にあります。
理想的な状態は、パフォーマンスに関しては、頻繁に使用されるデータはRAMにあり、現時点で不要なデータはディスク上にあることです。
通常のシステムでは、カーネルはこの理想に到達するために2つのことを行います。

  • しばらく使用されなかったアプリケーションデータは、ディスクに移動できます。これはスワップです。
  • 最近使用されたファイルのデータはRAMに保持されます。これは、ディスクキャッシュ(ディスクから読み取られるデータの場合)とディスクバッファー(ディスクに書き込まれるデータの場合)です。

典型的なシステムでは、RAMのかなりの部分がキャッシュとバッファに費やされます(50%は典型的な数値です)。RAMは有限ですリソース、これはスワップするために一部のアプリケーションデータを置き換える必要がある場合があります(スワップはRAMを使用するより良い方法がある場合にのみ必要です)。

スワップのないシステムでは、アプリケーションデータがほとんどすべてのRAMを使用しているため、キャッシュ用のスペースがほとんどありません。次に、システムが遅くなる可能性があります。カーネルは、本当に必要になるまで、アプリケーションの強制終了を開始しません。アプリケーションが使用可能なメモリの99%しか満たさない限り、システムは動作し続けますが、ファイルデータは常にディスクからロードおよび再ロードする必要があるため、非常に遅くなります。同じアプリケーションを実行している場合、その時点でスワップを使用すると、システムが高速になります。

この問題の詳細については、 このlkmlディスカッション および このブログ投稿 を参照してください。

カーネルにRAMをディスクキャッシュ用に予約するように指示する直接的な方法はわかりません。あなたは RAMスワップスペースとして 、おそらく 圧縮された でも その前に成功レポート がありますが、私はあなたの特定のケースでは保証しません。

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

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

6
Dan Dascalescu

Peoro、私はあなたが同意します。システムには、メモリの量に応じてメモリを管理し、リソース不足によるシステムのハングを回避するための容量が必要です。最近、32GBのRAMでシステムを構築しました。最初はシステムがスワップを持たないのに十分であると考えられていましたが、毎月約1倍の頻度でハングしています。毎月のRAID再同期とデータチェックを実行すると、頻繁にハングすることに気づきました。システムがハングしないように、後で100GBのスワップを割り当てました。私が見つけたのは、システムがスワップを使用することが多く、非常に応答が遅くなることですが、タスクが終了すると、システムはより応答しやすくなります。多くの場合、システムを再起動して応答性を高める必要があります。これは、集中的なタスクを実行した後、システム自体が自動でクリーニングされず、RAMの使用率が低下するためです。物理的なスワップは確かに集中的なタスクをより遅い速度で実行する方法ですが、システムは本当にリソースが不要でそれ自体をカットするときに、より良い制御を必要とします。

スクリプトを実行してそれらのプロセスを強制終了するというアイデアが気に入っていますが、ユーザーが現在実行している重要なプロセスを強制終了すると、大変なことになります。非アクティブなプロセスが不要なときに自動的に強制終了できれば、問題が解決する可能性があります。

0
Shen En Chen