Sun Java System Application Server Enterprise Edition 8.2 パフォーマンスチューニングガイド

Solaris のチューニング

チューニングパラメータ

Solaris の TCP/IP 設定のチューニングは、多数のソケットを開閉するプログラムで役立ちます。Application Server は少数の固定された接続のセットで動作するので、パフォーマンスがそれほど顕著に向上しない場合もあります。

次の表に、パフォーマンスとスケーラビリティーのベンチマークに影響する Solaris のチューニングパラメータを示します。これらの値は、最適なパフォーマンスを得るためのシステムの調整例を示しています。

表 5–1 Solaris のパラメータのチューニング

パラメータ 

スコープ 

デフォルト 

調整値 

コメント 

rlim_fd_max

/etc/system 

1024 

8192 

プロセスが開けるファイル記述子の制限。予想される負荷 (存在する場合は、関連付けられたソケット、ファイル、パイプなど) を考慮して設定します。 

rlim_fd_cur

/etc/system 

1024 

8192 

 

sq_max_size

/etc/system 

ストリームドライバのキューサイズを制限します。0 に設定すると無限になり、バッファーの容量不足がパフォーマンスに影響しなくなります。クライアント上でも設定します。 

tcp_close_wait_interval

ndd /dev/tcp 

240000 

60000 

クライアント上でも設定します。 

tcp_time_wait_interval

ndd /dev/tcp 

240000 

60000 

 

tcp_conn_req_max_q

ndd /dev/tcp 

128 

1024 

 

tcp_conn_req_max_q0

ndd /dev/tcp 

1024 

4096 

 

tcp_ip_abort_interval

ndd /dev/tcp 

480000 

60000 

 

tcp_keepalive_interval

ndd /dev/tcp 

7200000 

900000 

トラフィックの多い Web サイトでは、この値を小さくします。 

tcp_rexmit_interval_initial

ndd /dev/tcp 

3000 

3000 

再転送率が 30 〜 40% を超える場合は、この値を大きくします。 

tcp_rexmit_interval_max

ndd /dev/tcp 

240000 

10000 

 

tcp_rexmit_interval_min

ndd /dev/tcp 

200 

3000 

 

tcp_smallest_anon_port

ndd /dev/tcp 

32768 

1024 

クライアント上でも設定します。 

tcp_slow_start_initial

ndd /dev/tcp 

データが少量であればやや高速に転送します。 

tcp_xmit_hiwat

ndd /dev/tcp 

8129 

32768 

送信バッファーのサイズ。 

tcp_recv_hiwat

ndd /dev/tcp 

8129 

32768 

送信バッファーのサイズ。 

tcp_recv_hiwat

ndd /dev/tcp 

8129 

32768 

受信バッファーのサイズ。 

tcp_conn_hash_size

ndd /dev/tcp 

512 

8192 

接続ハッシュテーブルのサイズ。「接続ハッシュテーブルのサイジング」を参照してください。

接続ハッシュテーブルのサイジング

接続ハッシュテーブルには、アクティブな TCP 接続に関するすべての情報が保持されます。接続ハッシュテーブルのサイズを取得するには、次のコマンドを使用します。

ndd -get /dev/tcp tcp_conn_hash

この値によって接続数が制限されることはありませんが、接続のハッシュにかかる時間が長くなることがあります。デフォルトサイズは 512 です。

ルックアップを効率化するには、サーバーで予想される同時 TCP 接続数の半分の値を設定します。この値は、/etc/system でのみ設定可能で、起動時に有効になります。

現在の TCP 接続数を取得するには、次のコマンドを使用します。

netstat -nP tcp|wc -l

ファイル記述子の設定

Solaris では、ulimit プロパティーによる開けるファイルの最大数の設定は、サポートできる RMI/IIOP クライアントの最大数に大きく影響します。

強い制限値を引き上げるには、/etc/system に次のコマンドを追加して 1 回再起動します。

set rlim_fd_max = 8192

次のコマンドを使用して、この強い制限値を確認します。

ulimit -a -H

強い制限値を設定したら、次のコマンドを使用して、このプロパティーの値を明示的に (この制限値まで) 増やします。

ulimit -n 8192

次のコマンドを使用して、この制限値を確認します。

ulimit -a

たとえば、ulimit のデフォルト値の 64 では、簡単なテストドライバでサポートできる同時クライアントの数は 25 ですが、ulimit を 8192 に設定すると、同じテストドライバで 120 の同時クライアントをサポートできます。このテストドライバは複数のスレッドを生成し、各スレッドは JNDI 検索を実行して同じビジネスメソッドを繰り返し呼び出します。ビジネスメソッドの呼び出し間の思考 (遅延) 時間は 500 ミリ秒で、約 100K バイトのデータがやりとりされます。

これらの設定は、Solaris 上の RMI/IIOP クライアントに適用されます。ファイル記述子の制限設定の詳細については、Solaris のオンラインマニュアルを参照してください。

代替スレッドの使用

Solaris オペレーティング環境では、デフォルトで 2 レベルのスレッドモデルがサポートされます (Solaris 8 まで)。アプリケーションレベルの Java スレッドは、ユーザーレベルの Solaris スレッドにマッピングされ、制限のある軽量プロセス (LWP) プール上で多重化されます。カーネルリソースを維持し、システムの効率を最大にするには、システムのプロセッサと同じ数の LWP があれば十分です。これは、ユーザーレベルのスレッドが何百もある場合に役立ちます。JVM に応じて、複数のスレッドモデルか、モデル内での複数の同期メソッドのどちらかを選択できます。

Solaris 8 で、LD_LIBRARY_PATH/usr/lib の前に /usr/lib/lwp を挿入して、/usr/lib/lwp/ にある代替スレッド libthread.so を読み込んでみてください。一部のアプリケーションでは、特に、使っているスレッドが少ない場合は、スループットとシステム利用率が向上します。

デフォルトでは、Application Server は /usr/lib/lwp を使用します。デフォルトの設定を変更して LWP を使わないようにするには、startserv スクリプトの LD_LIBRARY_PATH から /usr/lib/lwp を削除します。ただし、本当に必要な場合以外は変更しないでください。

多数のスレッドを使うアプリケーションには、/usr/lib/libthread.so ライブラリの使用をお勧めします。これにより、1.4 のデフォルトである LWP ベースの同期が有効になるだけでなく、TLABS (スレッドローカル割り当てバッファー) が無効になるため、ヒープがすぐに使い果たされてガベージコレクションが頻繁に行われる可能性があります。多数のスレッドを使用するアプリケーションでは -Xconcurrentio の使用方法も参照してください。

詳細情報

Solaris のスレッドに関する問題の詳細については、「Solaris and Java Threading」を参照してください。

HotSpot JVM のチューニングの詳細については、「詳細情報」を参照してください。