バックグラウンド
約 20 の Linux ブレードのプールがあります。Suse を実行している人もいれば、Redhat を実行している人もいます。次の 3 つのフォルダーを含むすべての共有 NAS スペース:
- /NAS/app/java - Java JDK のインストールを指すシンボリック リンク。現在のバージョン 1.5.0_10
- /NAS/app/lib - アプリケーションのバージョンを指すシンボリック リンク。
- /NAS/data - 出力が書き込まれるディレクトリ
すべてのマシンには、4 GB の物理メモリと 4 GB のスワップ スペースを備えた 2 つのプロセッサ (ハイパースレッド) があります。各マシンが一度に処理できる「ジョブ」の数を 6 に制限しています (この数はおそらく変更する必要がありますが、現在の問題には含まれていないため、当面は無視してください)。
一部のジョブでは最大ヒープ サイズを 512mb に設定し、他のジョブでは最大ヒープ サイズを 2048mb に設定しています。繰り返しになりますが、ヒープ サイズが 2048 に設定された同じマシンで 6 つのジョブが開始された場合、使用可能なメモリを超える可能性があることはわかっていますが、私たちの知る限り、これはまだ発生していません。
問題
ジョブがすぐに失敗し、次のメッセージが表示されることがあります。
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
これは、同じマシンで同時に実行されるジョブが多すぎるためだと考えていました。問題が発生する頻度は非常に低いため ( 1か月に 1 回程度)、再起動するだけで問題ありませんでした。
この問題は最近、さらに悪化しています。2048m の最大ヒープ サイズを要求するすべてのジョブは、ほぼ毎回すぐに失敗し、完了するまでに数回再起動する必要があります。
個々のマシンに出て、手動で実行しようとしましたが、同じ結果が得られました。
デバッグ
この問題は SuSE ボックスにのみ存在することが判明しました。より頻繁に発生している理由は、マシンを追加しているためです。新しいマシンは SuSE です。
SuSEボックスで「cat /proc/version」を実行すると、次のようになります。
Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005
RedHat ボックスで「cat /proc/version」を実行すると、次のようになります。
Linux version 2.4.21-32.0.1.ELsmp (bhcompile@bugs.build.redhat.com) (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-52)) #1 SMP Tue May 17 17:52:23 EDT 2005
「uname -a」を実行すると、両方のタイプのマシンで次の結果が得られます。
UTC 2005 i686 i686 i386 GNU/Linux
マシン上でジョブが実行されておらず、他のプロセスが多くのメモリを使用していません。現在実行中のすべてのプロセスが合計 100 MB を使用している可能性があります。
'top' は現在、次を示しています。
Mem: 4146528k total, 3536360k used, 610168k free, 132136k buffers
Swap: 4194288k total, 0k used, 4194288k free, 3283908k cached
現在、「vmstat」には次の情報が表示されます。
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 610292 132136 3283908 0 0 0 2 26 15 0 0 100 0
次のコマンド ライン (1850 MB の最大ヒープ) でジョブを開始すると、正常に開始されます。
java/bin/java -Xmx1850M -cp helloworld.jar HelloWorld
Hello World
最大ヒープ サイズを 1875mb に上げると失敗します。
java/bin/java -Xmx1875M -cp helloworld.jar HelloWorld
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
現在使用されているメモリがバッファリング/キャッシング用であることは明らかであり、そのため「空き」として表示されるメモリはほとんどありません。明確でないのは、1850 mb の魔法のラインがあり、それ以上になると Java が起動できないことを意味する理由です。
説明をいただければ幸いです。