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

第 5 章 オペレーティングシステムのチューニング

この章では、最適なパフォーマンスを得るための、オペレーティングシステム (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 と同じ容量の場合に最適に動作し、ドキュメント ツリーのマッピングにも十分に対応できます。

ネットワーク関連機能

アプリケーションに必要な帯域幅を決定するには、次の値を調べます。

次に、必要な帯域幅を次のように計算します。

Npeakr / t

たとえば、ピーク時に 50 人のユーザーをサポートし、平均ドキュメントサイズが 24K バイトで、各ドキュメントを平均 5 秒で送信する場合は、240K バイト (1920K ビット/秒) 必要です。そのため、このサイトには 2 本の T1 回線 (それぞれが 1544K ビット/秒) が必要です。この帯域幅だと、オーバーヘッドがいくらか増えても対応できます。

サーバーのネットワークインタフェースカードは、接続される WAN 以上をサポートする必要があります。たとえば、最大で 3 本の T1 回線を使用する場合は、10BaseT インタフェースで対応できます。1 本の T3 回線 (45M ビット/秒) までは、100BaseT を使用できます。ただし、WAN の帯域幅が 50M ビット/秒を超える場合は、複数の 100BaseT インタフェースを設定するか、ギガビット Ethernet 技術を検討してください。

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 のチューニングの詳細については、「詳細情報」を参照してください。

Linux の設定

システムの起動時に実行される /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 のチューニング

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

これらの設定は、ファイル記述子に影響します。

IP スタックの設定

/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

これらの設定は、IP スタックを調整します。

このファイルに加えた変更がシステムの再起動時に常に維持されるようにするには、システムの再起動時に実行される起動スクリプトのデフォルトの 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 プラットフォームのチューニング

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

openfilesdescriptors には、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) の名前です。

ディスク入出力の設定

ProcedureSCSI 以外のディスクのディスク入出力パフォーマンスを調整する

  1. ディスクの速度をテストします。

    次のコマンドを使用します。


    /sbin/hdparm -t /dev/hdX
  2. ダイレクトメモリーアクセス (DMA) を有効にします。

    次のコマンドを使用します。


    /sbin/hdparm -d1 /dev/hdX
  3. 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」を参照してください。

TCP/IP 設定

ProcedureTCP/IP 設定を調整する

  1. /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
  2. /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
  3. /etc/rc.local の最後のエントリとして次の行を追加します。


    sysctl -p /etc/sysctl.conf
  4. システムを再起動します。

  5. 次のコマンドを使用して、送信バッファーのサイズを大きくします。


    tcp_recv_hiwat ndd /dev/tcp 8129 32768