6GB RAM を搭載した VMWareEsx3.5(x64) 上で RedHat 3.4.6(x32) を実行しています。いくつかの Java プロセス (jboss を含む) がバックグラウンドで実行されています。
問題は、Java プロセスが大量のメモリを消費し、OOM-killer によって強制終了される場合があることです。OOM-killer が動作を開始すると、空き物理メモリは 100MB ~ 200MB と非常に少なくなりますが、スワップは使用されません (99% 空き)。これによりカーネル パニックが発生する場合もあります。
- では、なぜスワップが使用されないのでしょうか?
- このカーネルパニックを調査するにはどうすればいいでしょうか?
- 32 ビット Redhat で 6GB のメモリを使用するのは賢明でしょうか?
ありがとう
答え1
個人的には、PAE (32 ビット システムで 4G を超える RAM) は絶対に使用しません。実際の 64 ビット カーネルとシステムを実行すると、はるかに優れたパフォーマンスが得られます。
OOM は、malloc が失敗する可能性がある場合にのみトリガーされる必要があります (使用可能なスワップが大量にある場合ではありません)。
32 ビット カーネルが原因の一部である可能性があります。PAE は異なるメモリ ゾーンを使用するため、あるゾーンが別のゾーンからの malloc を許可されていない可能性があります。
swappiness (カーネルがスワップをどれだけ容易に使用するか) を変更しましたか? cat /proc/sys/vm/swappiness ?
また、vm.dirty_ratio または vm.lower_zone_protection = 100 のチューニングも検討してください。
カーネルパニックをキャプチャしましたか? (シリアルコンソールはこれを行うのに適した方法です)
独自のプロセス監視ソフトウェアを使用して OOM-Killer を先制することもできます。(Monit を参照してください)
幸運を祈ります
答え2
Oracle/Java を実行している RHEL4 仮想マシンは、OOM キラーによってプロセスをランダムに強制終了します。詳細 OOM キラーは、ESX にメモリ負荷がかかっていない場合でもアプリケーションを強制終了します。コマンド top は、大量のメモリがキャッシュされており、スワップはほとんど使用されていないことを示しています。解決策
コピーするデータのサイズが物理メモリのサイズを超えると、oom-killer はランダムにプロセスを強制終了し始めます。
これは、次のコマンドを実行することで修正できます。
sysctl -w vm.lower_zone_protection 100
lower_zone_protection を 100 に設定すると、空きページのしきい値が 100 増加し、ページの再利用が早く開始され、NFS (ネットワーク ファイル システム) がカーネルのメモリ要求に大きく遅れることがなくなります。これにより、ページの再利用が早く行われるため、ゾーンの「保護」が強化されます。この問題は Redhat によって RHEL で特定されており、次の記事で回避策が提供されています。