皆さん、先週、大規模な顧客サイトでの Java サーバー アプリケーションの負荷テスト ワークショップ中に、64 ビット JVM を使用すると、約 1300 ~ 1800 の同時セッションしか実行できませんでしたが、同じ構成では 2800 の同時セッションを実行できました。 32 ビット JVM で。
環境情報: Solaris 10 、Java 1.6.0_30 、Jetty 8.1.5 、Web アプリケーションは I/O バウンドであり、プロセスごとに 1000 のほとんどアイドル状態のスレッドがあり、6 ~ 12 の Java プロセスがほとんど違いなく生成されました。障害発生時、CPU 容量は 50% 未満、ファイル記述子は 65536 に設定されていました。
ある時点で 64 ビット JVM を実行すると、CPU が 50% 未満の状態になり、マシン レベルと Java プロセス レベルの両方で十分なメモリがまだ利用可能でした。この時点で、製品のさまざまなレイヤーで「IOException」と「EOFException」が発生し始めました。私たちが知る限り、この時点で実際のネットワークや通信の問題はありませんでした. Solaris マシンでソケット通信に関連するリソースが不足しているように見えます。64 ビット JVM は、32 ビット JVM と比較してこのリソースを 2 倍消費しているようです。
何か案は ?注目すべき違いの 1 つは、64 ビット JVM はスレッド スタックごとに 1024k を消費するのに対し、32 ビットはスレッドごとに 512k しか消費しないことです。これが理由でしょうか?スレッド スタックとソケット I/O は、Solaris で同じメモリ プールから割り当てられますか? このプールを増やすことはできますか? 64 ビット VM のスレッド スタック サイズを 512k に減らす必要がありますか?