Solaris の TCP/IP 設定のチューニングは、多数のソケットを開閉するプログラムで役立ちます。Application Server は少数の固定された接続のセットで動作するので、パフォーマンスがそれほど顕著に向上しない場合もあります。
次の表に、パフォーマンスとスケーラビリティーのベンチマークに影響する Solaris のチューニングパラメータを示します。これらの値は、最適なパフォーマンスを得るためのシステムの調整例を示しています。
表 5–1 Solaris のパラメータのチューニング
パラメータ |
スコープ |
デフォルト |
調整値 |
コメント |
---|---|---|---|---|
/etc/system |
1024 |
8192 |
プロセスが開けるファイル記述子の制限。予想される負荷 (存在する場合は、関連付けられたソケット、ファイル、パイプなど) を考慮して設定します。 |
|
/etc/system |
1024 |
8192 | ||
/etc/system |
2 |
0 |
ストリームドライバのキューサイズを制限します。0 に設定すると無限になり、バッファーの容量不足がパフォーマンスに影響しなくなります。クライアント上でも設定します。 |
|
ndd /dev/tcp |
240000 |
60000 |
クライアント上でも設定します。 |
|
ndd /dev/tcp |
240000 |
60000 | ||
ndd /dev/tcp |
128 |
1024 | ||
ndd /dev/tcp |
1024 |
4096 | ||
ndd /dev/tcp |
480000 |
60000 | ||
ndd /dev/tcp |
7200000 |
900000 |
トラフィックの多い Web サイトでは、この値を小さくします。 |
|
ndd /dev/tcp |
3000 |
3000 |
再転送率が 30 〜 40% を超える場合は、この値を大きくします。 |
|
ndd /dev/tcp |
240000 |
10000 | ||
ndd /dev/tcp |
200 |
3000 | ||
ndd /dev/tcp |
32768 |
1024 |
クライアント上でも設定します。 |
|
ndd /dev/tcp |
1 |
2 |
データが少量であればやや高速に転送します。 |
|
ndd /dev/tcp |
8129 |
32768 |
送信バッファーのサイズ。 |
|
ndd /dev/tcp |
8129 |
32768 |
送信バッファーのサイズ。 |
|
ndd /dev/tcp |
8129 |
32768 |
受信バッファーのサイズ。 |
|
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 のチューニングの詳細については、「詳細情報」を参照してください。