あなたのコメントから、それはシステムがちょうど交換しているようです。
LinuxにはOOMキラーがあり、システムがメモリをオーバーコミットしたときに呼び出され、現在は実行されています。
Linuxはデフォルトでメモリのオーバーコミットを実行します。つまり、基本的には、システムが実際に持っているよりも多くのメモリをプログラムに提供します。これは、プログラムが実際に要求するすべてのメモリを使用しないことを前提にしています。ただし、システムがメモリ不足になると、実行中のさまざまなプロセスにメモリがあることを既に通知しているため、メモリを拒否することはできません。代わりに、それはOOMキラーを呼び出すことです。OOMキラーは基本的に、カーネルがメモリ不足状態を緩和すると考えるプロセスを見つけます。通常、これは最も多くのメモリを使用するプロセスですが、アルゴリズムは実際にはそれよりもはるかに複雑です。
(自動モード)にovercommit_memory
設定しているため0
、カーネルはメモリのオーバーコミットを実行しています。ですから、あなたの説明された振る舞いから、それはシステムがひどく交換しているように聞こえます。
ここから2つのオプションがあります。
スワップを減らす
システムのRAMが不足しているため、カーネルが物事をスワップに押し込み始めます。システムのスワップが不足すると、OOMキラーが呼び出されます。ただし、空きスワップ領域が残っているため、これは起こりません。
オリジナルのアイデア、手動でプロセスを強制終了します。
システムのスワップが多すぎて何かを停止する必要があると思われる場合は、プロセスを手動で強制終了できます。これは、カーネルのSysRqトリガーを介して実行できます。
カーネルには「マジックSysRq」と呼ばれるものがあります。これは、ある種の緊急操作を実行するようにカーネルに指示する少しの機能です。これは、「すべてのボリュームを読み取り専用で再マウントする」、「すべてのファイルシステムを同期する」、「今すぐ再起動する」などの場合があります。これらのオプションの1つは、OOMキラーを呼び出すことでもあります。
カーネルでマジックSysRqが有効になっている場合(カーネルオプションCONFIG_MAGIC_SYSRQ
)、これを行うには2つの方法があります。
- Alt+ SysRq+ f
キーボードのこれら3つのキーを押すだけです。
echo f > /proc/sysrq-trigger
これは、キーボードメソッドとまったく同じタスクを実行しますが、プログラムで実行します。
スワップを完全に無効にすることもできます。これは、ほとんどのシステムで私が行っていることであり、このためです。スワップは、カーネルが使用されていないデータを先取りしてスワップアウトし、より多くのRAMをキャッシュに使用できるようにするという点で有益です。しかし、それはあなたが見ているこの強制スワッピング問題につながります。
個人的には、最善の解決策は、強制スワッピングでOOMキラーを呼び出すカーネルオプションのようなものだと思います。基本的にプリエンプティブスワップを機能させますが、RAMが不足しているためにカーネルが何かをスワップに強制的に移動する場合は、OOMキラーを呼び出します。
残念ながら、これは私自身の個人的な願いです。これは行いません。