この章では、最適なパフォーマンスを得るための、オペレーティングシステム (OS) のチューニングについて説明します。この章の内容は次のとおりです。
ここでは、次のサーバーサブシステムに関するサーバーのスケーリングで最適なパフォーマンスを得るための推奨事項について説明します。
Application Server では、自動的に複数の CPU が利用されます。一般に、複数の CPU による効率はオペレーティングシステムと作業負荷によって異なりますが、通常は、プロセッサが多いほど動的コンテンツのパフォーマンスは向上します。
静的コンテンツには、CPU アクティビティーよりも、主に入出力 (I/O) アクティビティーが関係します。サーバーが適切に調整されている場合、主メモリーを増やせばコンテンツのキャッシュ量も増え、その結果、CPU アクティビティーに使用される時間に対して I/O アクティビティーに使用される時間の相対量が増えます。CPU 数を 2 倍にすると、サーブレットのパフォーマンスが 50 〜 80% 向上するということが、調査により判明しています。
サポートされているオペレーティングシステム別のメモリーに関する推奨事項については、『Sun Java System Application Server Enterprise Edition 8.2 リリースノート (UNIX 版)』の「ハードウェアとソフトウェアの要件」を参照してください。
OS、ドキュメントツリー、およびログファイルに十分な ディスク容量を用意することをお勧めします。ほとんどの場合は、合計 2G バイトで十分です。
OS、スワップファイルとページングファイル、Application Server ログ、およびドキュメントツリーを、それぞれ別個のハードドライブに配置します。このようにすると、ログドライブがログファイルでいっぱいになっても、OS に影響しません。また、OS のページングファイルによるドライブアクティビティーが発生しているかどうかを見分けることなども容易です。
OS ベンダーは、通常、スワップ空間やページング空間の割り当て量の推奨値を提示しています。Sun のテストによると、Application Server は、スワップ空間が RAM と同じ容量の場合に最適に動作し、ドキュメント ツリーのマッピングにも十分に対応できます。
アプリケーションに必要な帯域幅を決定するには、次の値を調べます。
サーバーで処理する必要があるピーク時の同時ユーザー数 (N peak)。
サイトの平均要求サイズ (r)。平均要求には、複数のドキュメントが含まれる場合があります。不確かな場合は、ホームページと、関連付けられたすべてのファイルとグラフィックスを使用します。
ピーク使用時に平均的なユーザーがドキュメントを快く待っていられる時間 (t) を決めます。
次に、必要な帯域幅を次のように計算します。
Npeakr / t
たとえば、ピーク時に 50 人のユーザーをサポートし、平均ドキュメントサイズが 24K バイトで、各ドキュメントを平均 5 秒で送信する場合は、240K バイト (1920K ビット/秒) 必要です。そのため、このサイトには 2 本の T1 回線 (それぞれが 1544K ビット/秒) が必要です。この帯域幅だと、オーバーヘッドがいくらか増えても対応できます。
サーバーのネットワークインタフェースカードは、接続される WAN 以上をサポートする必要があります。たとえば、最大で 3 本の T1 回線を使用する場合は、10BaseT インタフェースで対応できます。1 本の T3 回線 (45M ビット/秒) までは、100BaseT を使用できます。ただし、WAN の帯域幅が 50M ビット/秒を超える場合は、複数の 100BaseT インタフェースを設定するか、ギガビット Ethernet 技術を検討してください。
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 のチューニングの詳細については、「詳細情報」を参照してください。
システムの起動時に実行される /etc/rc.d/rc.local ファイルに、次のパラメータを追加してください。
<-- begin #最大ファイル数は 4M バイトあたり 256 記述子までに更新されました。 システムの RAM 容量に基づいて、ファイル記述子の数を指定します。 echo "6553" > /proc/sys/fs/file-max #inode-max は file-max の 3 〜 4 倍です #ファイルが存在しません。 #echo"262144" > /proc/sys/fs/inode-max #利用できるローカルポートを増やします echo 1024 25000 > /proc/sys/net/ipv4/ip_local_port_range #ソケットバッファーで利用できるメモリーを増やします echo 2621143 > /proc/sys/net/core/rmem_max echo 262143 > /proc/sys/net/core/rmem_default #2.4.X のカーネルでは次のように設定します echo 4096 131072 262143 > /proc/sys/net/ipv4/tcp_rmem echo 4096 13107262143 > /proc/sys/net/ipv4/tcp_wmem #"RFC2018 TCP 選択確認応答" と "RFC1323 TCP タイムスタンプ" を無効にします echo 0 > /proc/sys/net/ipv4/tcp_sack echo 0 > /proc/sys/net/ipv4/tcp_timestamps #実行時に shm に割り当てられるメモリーの最大量を 2 倍にします echo "67108864" > /proc/sys/kernel/shmmax #Linux の仮想メモリー VM サブシステムを改善します echo "100 1200 128 512 15 5000 500 1884 2" > /proc/sys/vm/bdflush #sysctl も実行します sysctl -p /etc/sysctl.conf -- end -->
さらに、/etc/sysctl.conf ファイルを作成し、次の値を追加します。
<-- begin #パケット転送を無効にします net.ipv4.ip_forward = 0 #ソースルートの検証を有効にします net.ipv4.conf.default.rp_filter = 1 #magic-sysrq キーを無効にします kernel.sysrq = 0 fs.file-max=65536 vm.bdflush = 100 1200 128 512 15 5000 500 1884 2 net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_max= 262143 net.core.rmem_default = 262143 net.ipv4.tcp_rmem = 4096 131072 262143 net.ipv4.tcp_wmem = 4096 131072 262143 net.ipv4.tcp_sack = 0 net.ipv4.tcp_timestamps = 0
kernel.shmmax = 67108864
Solaris システムのチューニングの詳細については、『Solaris Tunable Parameters Reference Manual』を参照してください。
x86 上の Solaris を Application Server および HADB 用に調整するときは、次のオプションについて検討します。
いくつかの値は、利用可能なシステムリソースによって異なります。/etc/system に変更を加えた場合は、マシンを再起動してください。
/etc/system ファイルに次の行を追加 (または編集) します。
set shmsys:shminfo_shmmax=0xffffffff set shmsys:shminfo_shmseg=128 set semsys:seminfo_semmnu=1024 set semsys:seminfo_semmap=128 set semsys:seminfo_semmni=400 set semsys:seminfo_semmns=1024
これらの設定は、セマフォーの数と共有メモリーに影響します。これらは、Application Server よりも、HADB サーバーを実行しているマシンのほうに深く関係します。
/etc/system ファイルに次の行を追加 (または編集) します。
set rlim_fd_max=65536 set rlim_fd_cur=65536 set sq_max_size=0 set tcp:tcp_conn_hash_size=8192 set autoup=60 set pcisch:pci_stream_buf_enable=0
/etc/system ファイルに次の行を追加 (または編集) します。
set ip:tcp_squeue_wput=1 set ip:tcp_squeue_close=1 set ip:ip_squeue_bind=1 set ip:ip_squeue_worker_wait=10 set ip:ip_squeue_profile=0
このファイルに加えた変更がシステムの再起動時に常に維持されるようにするには、システムの再起動時に実行される起動スクリプトのデフォルトの TCP 変数を次のように変更します。
ndd -set /dev/tcp tcp_time_wait_interval 60000 ndd -set /dev/tcp tcp_conn_req_max_q 16384 ndd -set /dev/tcp tcp_conn_req_max_q0 16384 ndd -set /dev/tcp tcp_ip_abort_interval 60000 ndd -set /dev/tcp tcp_keepalive_interval 7200000 ndd -set /dev/tcp tcp_rexmit_interval_initial 4000 ndd -set /dev/tcp tcp_rexmit_interval_min 3000 ndd -set /dev/tcp tcp_rexmit_interval_max 10000 ndd -set /dev/tcp tcp_smallest_anon_port 32768 ndd -set /dev/tcp tcp_slow_start_initial 2 ndd -set /dev/tcp tcp_xmit_hiwat 32768 ndd -set /dev/tcp tcp_recv_hiwat 32768
Linux で最大のパフォーマンスが得られるように調整するには、次の調整を行う必要があります。
ファイル記述子の数をデフォルト値よりも増やす必要がある場合があります。ファイル記述子の数を増やすと、サーバーが高負荷時でもソケットを開くことができるようになり、クライアントから受け取る要求の処理が中止されなくなります。
まず、次のコマンドを使用して、ファイル記述子のシステム制限を確認します。
cat /proc/sys/fs/file-max 8192
現在の制限は 8192 と示されています。これを 65535 に増やすには、次のコマンドを root として実行します。
echo "65535" > /proc/sys/fs/file-max
システムを再起動してもこの値を維持するには、これを /etc/sysctl.conf に追加し、許可されるオープンファイルの最大数を指定します。
fs.file-max = 65535
注意: このパラメータは proc.sys.fs.file-max ではありませんので、間違えないようにしてください。
sysctl を使用して変更できる使用可能パラメータを一覧表示するには、次のコマンドを使用します。
sysctl -a
sysctl.conf ファイルから新しい値を読み込むには、次のコマンドを使用します。
sysctl -p /etc/sysctl.conf
シェルあたりの制限値を確認および変更するには、次のコマンドを使用します。
limit
次のように出力されます。
cputime unlimited filesize unlimited datasize unlimited stacksize 8192 kbytes coredumpsize 0 kbytes memoryuse unlimited descriptors 1024 memorylocked unlimited maxproc 8146 openfiles 1024
openfiles と descriptors には、1024 の制限値が示されています。全ユーザーを対象にこの制限値を 65535 に増やすには、root として/etc/security/limits.conf を編集し、nofile 設定 (ファイル数) エントリを変更または追加します。
* soft nofile 65535 * hard nofile 65535
「*」の文字は、すべてのユーザーを示すワイルドカードです。代わりに特定のユーザー ID を指定することもできます。
次に、/etc/pam.d/login を編集し、次の行を追加します。
session required /lib/security/pam_limits.so
Red Hat ではさらに、/etc/pam.d/sshd を編集し、次の行を追加する必要があります。
session required /lib/security/pam_limits.so
多くのシステムでは、ここまでの手順で十分です。残りの手順を実行する前に、通常のユーザーとしてログインし、結果を試してください。プラグイン可能認証モジュール (PAM) およびセキュアシェル (SSH) の設定方法によっては、残りの手順は不要な場合があります。
仮想メモリーの設定を変更するには、/etc/rc.local に次のエントリを追加します。
echo 100 1200 128 512 15 5000 500 1884 2 > /proc/sys/vm/bdflush
詳細については、bdflush のマニュアルページを参照してください。
HADB の設定については、第 6 章「高可用性のチューニング」を参照してください。
ネットワークインタフェースを確実に全二重モードで動作させるには、/etc/rc.local に次のエントリを追加します。
mii-tool -F 100baseTx-FD eth0
eth0 は、ネットワークインタフェースカード (NIC) の名前です。
ディスクの速度をテストします。
次のコマンドを使用します。
/sbin/hdparm -t /dev/hdX |
ダイレクトメモリーアクセス (DMA) を有効にします。
次のコマンドを使用します。
/sbin/hdparm -d1 /dev/hdX |
hdparm コマンドを使用して速度をもう一度確認します。
DMA がデフォルトで有効にされていなければ、転送速度が大幅に向上している可能性があります。再起動するたびにこの設定が行われるようにするには、/etc/conf.d/local.start や /etc/init.d/rc.local など、起動スクリプトを呼び出すすべてのファイルに、/sbin/hdparm -d1 /dev/hdX という行を追加します。
SCSI ディスクについては、『System Tuning Info for Linux Servers』の「SCSI Tuning」を参照してください。
/etc/rc.local に次のエントリを追加します。
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout echo 60000 > /proc/sys/net/ipv4/tcp_keepalive_time echo 15000 > /proc/sys/net/ipv4/tcp_keepalive_intvl echo 0 > /proc/sys/net/ipv4/tcp_window_scaling |
/etc/sysctl.conf に次のエントリを追加します。
# Disables packet forwarding net.ipv4.ip_forward = 0 # Enables source route verification net.ipv4.conf.default.rp_filter = 1 # Disables the magic-sysrq key kernel.sysrq = 0 net.ipv4.ip_local_port_range = 1204 65000 net.core.rmem_max = 262140 net.core.rmem_default = 262140 net.ipv4.tcp_rmem = 4096 131072 262140 net.ipv4.tcp_wmem = 4096 131072 262140 net.ipv4.tcp_sack = 0 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_window_scaling = 0 net.ipv4.tcp_keepalive_time = 60000 net.ipv4.tcp_keepalive_intvl = 15000 net.ipv4.tcp_fin_timeout = 30 |
/etc/rc.local の最後のエントリとして次の行を追加します。
sysctl -p /etc/sysctl.conf |
システムを再起動します。
次のコマンドを使用して、送信バッファーのサイズを大きくします。
tcp_recv_hiwat ndd /dev/tcp 8129 32768 |