14

3つの異なるサーバーで実行する7つの異なるJavaデーモン(すべて7つ)があります。javaコマンドラインには-Xmx2048mと-Xss1024kがあります。これらの3つのサーバーでは、21のプロセスすべてで、上部と上部のVIRTサイズが2.5GBをわずかに下回っています。RESサイズは、デーモンによって300〜1.9GBの範囲で異なります。

本来あるべきことはこれですべてです。

新しいサーバーを入力します。より高速なCPU、より多くのRAM(8GBではなく16GB)、わずかに新しいJava(古いサーバーでは1.6.0_10-b33、新しいサーバーでは1.6.0_31-b04)。両方のシステム(およびJVM)は64ビットです。

2つのデーモンを新しいサーバーに移動しました。新しいサーバーでは、同じタスクが与えられると、デーモンは非常に多くのCPU(コアの価値について)を消費し、処理量を減らします。(古いシステムの5110プロセッサから新しいシステムの5620プロセッサに移動しました)。

CPU使用率(GCスレッド??)のほぼ完全な追加コアであり、一方のデーモンで5GBVIRTと2GBRES、もう一方のデーモンで10.5GBVIRTと2GBRESを報告します。

Javaがメモリ制限を無視する(またはその場合は無視するように見える)原因となるアイデアはありますか?

4

1 に答える 1

13

これはglibcの問題であることが判明しました。

私にとっての簡単な答えは次のとおりです。

MALLOC_ARENA_MAX=1をエクスポートします

これにより、プロセスのフットプリント(上部のVIRT)が最大5倍減少しました。CentOS5で見られるレベルに戻ります。

glibcの最近のバージョンには、「スレッドごとのメモリプール」という新機能があります。

http://www.centos.org/docs/5/html/5.4/Technical_Notes/glibc.html

1.71.1ログセクションの最後の項目でそれについて説明しています(非公開のバグについて言及しています...)

于 2012-09-02T01:19:57.687 に答える