この章では、スケーラビリティー調査の結果について説明します。これらの調査を参照することにより、サーバーのパフォーマンスや、Web Server の長所を最大限に活用するためのシステムの設定方法についてのサンプルを確認できます。
この章の内容は、次のとおりです。
調査での各テストの目標は、Sun Java System Web Server 7 のスケーラビリティーを示すことにありました。これらのテストはまた、異なる種類のコンテンツに対する構成やチューニングの要件を特定するためにも役立ちました。
調査は、次のコンテンツを使用して実行されました。
100% 静的
100% C CGI
100% Perl CGI
100% NSAPI
100% Java サーブレット
100% PHP/FastCGI
大量のインベントリを含む電子商取引 Web アプリケーション
チューニングした場合、動的および静的コンテンツに対するパフォーマンスで、Sun Java System Web Server 7.0 はほぼ直線的なスケーラビリティーを示しました。
調査 (電子商取引の調査を除く) は、次のハードウェアを使用して実行されました。電子商取引の調査のためのハードウェア情報については、「電子商取引テストのためのハードウェア」を参照してください。
静的コンテンツのための Web Server のシステム構成:
Sun Microsystems Sun Fire T2000 (120 MHz、8 コア) (このテストには 6 コアのみを使用)
16256M バイトのメモリー
Solaris 10 オペレーティングシステム
Sun StoreEdge 3510 × 3
Web Server のシステム構成:
Sun Microsystems Sun Fire T2000 (1000 MHz、6 コア)
16376M バイトのメモリー
Solaris 10 オペレーティングシステム
ドライバのシステム構成:
Sun Microsystems Sun FireTM X4100 × 3
Sun Microsystems Sun Fire V490 × 4 (2 × 1050 MHzUS-IV)
Sun Fire T1000 × 3
Sun Fire 880 (990 MHz US-III+)
8192M バイトのメモリー
Solaris 10 オペレーティングシステム
ネットワーク構成:
Web Server とドライバマシンを複数のギガビット Ethernet リンクで接続しました。
これらのテストのための読み込みドライバは、Faban ドライバと呼ばれる、社内で開発された Java アプリケーションフレームワークでした。
次のチューニング設定は、この調査でのすべてのテストに共通しています。また、個別の調査にも、構成とチューニングの追加情報が含まれている可能性があります。
set rlim_fd_max=500000 set rlim_fd_cur=500000 set sq_max_size=0 set consistent_coloring=2 set autoup=60 set ip:ip_squeue_bind=0 set ip:ip_soft_rings_cnt=0 set ip:ip_squeue_fanout=1 set ip:ip_squeue_enter=3 set ip:ip_squeue_worker_wait=0 set segmap_percent=6 set bufhwm=32768 set maxphys=1048576 set maxpgio=128 set ufs:smallfile=6000000 *For ipge driver set ipge:ipge_tx_ring_size=2048 set ipge:ipge_tx_syncq=1 set ipge:ipge_srv_fifo_depth=16000 set ipge:ipge_reclaim_pending=32 set ipge:ipge_bcopy_thresh=512 set ipge:ipge_dvma_thresh=1 set pcie:pcie_aer_ce_mask=0x1 *For e1000g driver set pcie:pcie_aer_ce_mask = 0x1
ndd -set /dev/tcp tcp_conn_req_max_q 102400 ndd -set /dev/tcp tcp_conn_req_max_q0 102400 ndd -set /dev/tcp tcp_max_buf 4194304 ndd -set /dev/tcp tcp_cwnd_max 2097152 ndd -set /dev/tcp tcp_recv_hiwat 400000 ndd -set /dev/tcp tcp_xmit_hiwat 400000
テストでは複数のネットワークインタフェースを使用したため、すべてのネットワークインタフェースが同じコアに行かないようにすることが重要でした。次のスクリプトを使用して、ネットワーク割り込みをコアの 1 つのストランドでは有効に、残りの 3 つのストランドでは無効にしました。
allpsr=`/usr/sbin/psrinfo | grep -v off-line | awk '{ print $1 }'` set $allpsr numpsr=$# while [ $numpsr -gt 0 ]; do shift numpsr=`expr $numpsr - 1` tmp=1 while [ $tmp -ne 4 ]; do /usr/sbin/psradm -i $1 shift numpsr=`expr $numpsr - 1` tmp=`expr $tmp + 1` done done |
次の例は、スクリプトを実行する前の psrinfo 出力を示しています。
# psrinfo | more 0 on-line since 12/06/2006 14:28:34 1 on-line since 12/06/2006 14:28:35 2 on-line since 12/06/2006 14:28:35 3 on-line since 12/06/2006 14:28:35 4 on-line since 12/06/2006 14:28:35 5 on-line since 12/06/2006 14:28:35 ................. |
次の例は、スクリプトを実行したあとの psrinfo 出力を示しています。
0 on-line since 12/06/2006 14:28:34 1 no-intr since 12/07/2006 09:17:04 2 no-intr since 12/07/2006 09:17:04 3 no-intr since 12/07/2006 09:17:04 4 on-line since 12/06/2006 14:28:35 5 no-intr since 12/07/2006 09:17:04 ................. |
次の表は、Web Server のために使用したチューニング設定を示しています。
表 6–1 Web Server のチューニング設定
構成要素 |
デフォルト |
チューニング値 |
---|---|---|
アクセスログ |
enabled=true |
enabled=false |
スレッドプール |
min-threads=16 max-threads=128 stack-size=131072 queue-size=1024 |
min-threads=128 max-threads=200 stack-size=262144 queue-size=15000 |
HTTP リスナー |
ポート 80 上のセキュリティー保護されていないリスナー listen-queue-size=128 |
ポート 80 上のセキュリティー保護されていないリスナー ポート 443 上のセキュリティー保護されたリスナー listen-queue-size=15000 |
キープアライブ |
enabled=true threads=1 max-connections=200 timeout= 30 sec |
enabled=true threads=2 max-connections=15000 timeout =180 sec |
default-web.xml |
JSP コンパイルが有効 |
JSP コンパイルが無効 |
次の表は、SSL テストのために使用した SSL セッションキャッシュのチューニング設定を示しています。
表 6–2 SSL セッションキャッシュのチューニング設定
構成要素 |
デフォルト |
---|---|
SSL セッションキャッシュ |
enabled=true max-entries=10000 max-ssl2-session-age=100 max-ssl3-tls-session-age=86400 |
ここでは、次のテストのためのテスト固有の構成、チューニング、および結果を示します。
パフォーマンスの特性を示すために、次の測定基準を使用しました。
1 秒あたりの操作数 (ops/秒) = 1 秒あたりの正常なトランザクション数
1 つのトランザクションに対する応答時間 (ラウンドトリップ時間) (ミリ秒単位)
パフォーマンスとスケーラビリティーの図は、システムで有効になっているコアの数に対するスループット (ops/秒) を示しています。
このテストは、それぞれ 1K 〜 1000K バイトのサイズの 36 のファイルを含む、10,000 のディレクトリのプールからランダムに選択されたファイルの静的なダウンロードを使用して実行されました。静的コンテンツテストの目標は、コアを飽和させ、それぞれのスループットと応答時間を調べることでした。
このテストでは、次の構成を使用しました。
ストライプ化ディスクアレイ (Sun StorEdge 3510) 上に静的ファイルを作成しました。
複数のネットワークインタフェースを設定しました。
Web Server を 64 ビットに設定しました。
次の表で説明されているチューニング設定を使用してファイルキャッシュを有効にしました。
デフォルト |
チューニング値 |
---|---|
enabled=true max-age=30 sec max-entries=1024 sendfile=false max-heap-file-size=524288 max-heap-space=10485760 max-mmap-file-size=0 max-mmap-space=0 |
enabled=true max-age=3600 max-entries=1048576 sendfile=true max-heap-file-size=1200000 max-heap-space=8000000000 max-mmap-file-size=1048576 max-mmap-space= l max-open-files=1048576 |
次の表は、静的コンテンツのスケーラビリティーの結果を示しています。
表 6–4 静的コンテンツのスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
10365 |
184 |
4 |
19729 |
199 |
6 |
27649 |
201 |
次の図は、静的コンテンツのスケーラビリティーの結果を示すグラフ表示です。
このテストは、サーブレットを使用して実行されました。このテストは、サーブレットの初期化引数、環境、要求ヘッダー、接続とクライアントの情報、URL 情報、およびリモートユーザー情報を出力します。サーバーには、JVM のチューニング設定を適用しました。目標は、サーバー上のコアを飽和させ、それぞれのスループットと応答時間を調べることでした。
次の表は、このテストで使用された JVM のチューニング設定を示しています。
表 6–5 JVM のチューニング設定
デフォルト |
チューニング値 |
---|---|
-Xmx128m -Xms256m |
-server -Xrs -Xmx2048m -Xms2048m -Xmn2024m -XX:+AggressiveHeap -XX:LargePageSizeInBytes=256m -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:ParallelGCThreads=<number of cores> -XX:+DisableExplicitGC |
次の表は、動的コンテンツサーブレットテストの結果を示しています。
表 6–6 動的コンテンツテスト: サーブレットのスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
5287 |
19 |
4 |
10492 |
19 |
6 |
15579 |
19 |
次の図は、サーブレットのスケーラビリティーの結果を示すグラフ表示です。
このテストは、printenv という名前の C 実行可能ファイルにアクセスすることにより実行されました。この実行可能ファイルは、環境変数情報を出力します。サーバーには、CGI のチューニング設定を適用しました。目標は、サーバー上のコアを飽和させ、それぞれのスループットと応答時間を調べることでした。
次の表は、このテストで使用された CGI のチューニング設定を示しています。
表 6–7 CGI のチューニング設定
デフォルト |
チューニング値 |
---|---|
idle-timeout=300 cgistub-idle-timeout=30 min-cgistubs=0 max-cgistubs=16 |
idle-timeout=300 cgistub-idle-timeout=1000 min-cgistubs=100 max-cgistubs=100 |
次の表は、C CGI に対する動的コンテンツテストの結果を示しています。
表 6–8 動的コンテンツテスト: C CGI のスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
892 |
112 |
4 |
1681 |
119 |
6 |
2320 |
129 |
次の図は、C CGI のスケーラビリティーの結果を示すグラフ表示です。
このテストは、CGI 環境を出力する printenv.pl という名前の Perl スクリプトを使用して実行されました。サーバーには、CGI のチューニング設定を適用しました。目標は、サーバー上のコアを飽和させ、それぞれのスループットと応答時間を調べることでした。
次の表は、Perl CGI に対する動的コンテンツテストで使用された CGI のチューニング設定を示しています。
表 6–9 CGI のチューニング設定
デフォルト |
チューニング値 |
---|---|
idle-timeout=300 cgistub-idle-timeout=30 min-cgistubs=0 max-cgistubs=16 |
idle-timeout=300 cgistub-idle-timeout=1000 min-cgistubs=100 max-cgistubs=100 |
次の表は、Perl CGI に対する動的コンテンツテストの結果を示しています。
表 6–10 動的コンテンツテスト: Perl CGI のスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
322 |
310 |
4 |
611 |
327 |
6 |
873 |
343 |
次の図は、Perl CGI のスケーラビリティーの結果を示すグラフ表示です。
このテストで使用された NSAPI モジュールは printenv2.so です。このモジュールは、NSAPI 環境変数を、応答全体を 2K バイトにするためのテキストとともに出力します。目標は、サーバー上のコアを飽和させ、それぞれのスループットと応答時間を調べることでした。
このテストのための唯一のチューニングは、未使用のパスチェックを削除することによる obj.conf 内のパスチェックの最適化でした。
次の表は、NSAPI に対する動的コンテンツテストの結果を示しています。
表 6–11 動的コンテンツテスト: NSAPI のスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
26264 |
14 |
4 |
12520 |
15 |
6 |
18417 |
16 |
次の図は、NSAPI のスケーラビリティーの結果を示すグラフ表示です。
PHP は、Web ベースの動的コンテンツの作成に特化した、広く使用されているスクリプト言語です。その単純性、アクセシビリティー、使用可能なモジュールの多さ、容易に使用可能なアプリケーションの多さなどで、インターネット上での使用がもっとも急速に拡大しているスクリプト言語です。
Web Server のスケーラビリティーと PHP エンジンの汎用性が組み合わされて、動的コンテンツのための、パフォーマンスの高い柔軟な Web 配備プラットフォームが提供されます。これらのテストでは、PHP バージョン 5.1.6 を使用しました。
テストは、次の 2 つのモードで実行されました。
Sun Java System Web Server 7.0 で使用可能な FastCGI プラグインを使用して呼び出されるアウトプロセスの fastcgi-php アプリケーション (http://www.zend.com/sun/ からダウンロード可能になる予定)。
インプロセスの PHP NSAPI プラグイン。
テストでは、phpinfo() クエリーを実行しました。目標は、サーバー上のコアを飽和させ、それぞれのスループットと応答時間を調べることでした。
次の表は、FastCGI プラグインテストのために使用した Web Server のチューニング設定を示しています。
表 6–12 FastCGI プラグインテストのためのチューニング設定
次の表は、FastCGI テストを使用した PHP の結果を示しています。
表 6–13 FastCGI を使用した PHP のスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
876 |
114 |
4 |
1706 |
117 |
6 |
2475 |
121 |
次の図は、FastCGI を使用した PHP のスケーラビリティーを示すグラフ表示です。
次の表は、NSAPI テストを使用した PHP のための Web Server のチューニング設定を示しています。
表 6–14 PHP のための NSAPI プラグイン設定
次の表は、NSAPI テストを使用した PHP の結果を示しています。
表 6–15 NSAPI を使用した PHP のスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
950 |
105 |
4 |
1846 |
108 |
6 |
2600 |
115 |
次の図は、NSAPI を使用した PHP のスケーラビリティーを示すグラフ表示です。
このテストは、それぞれ 1K 〜 1000K バイトのサイズの 36 のファイルを含む、10,000 のディレクトリのプールからランダムに選択されたファイルの静的なダウンロードを使用して実行されました。SSL 静的コンテンツテストの目標は、コアを飽和させ、それぞれのスループットと応答時間を調べることでした。このテストには T2000 の 4 コアのみを使用しました。
このテストでは、次の構成を使用しました。
ストライプ化ディスクアレイ (Sun StorEdge 3510) 上に静的ファイルを作成しました。
複数のネットワークインタフェースを設定しました。
表 6–3 にある設定を使用してファイルキャッシュを有効にし、チューニングしました。
表 6–2 にある設定を使用して SSL セッションキャッシュをチューニングしました。
Web Server を 64 ビットに設定しました。
次の表は、SSL 静的コンテンツテストの結果を示しています。
表 6–16 SSL パフォーマンステスト: 静的コンテンツのスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
2284 |
379 |
4 |
4538 |
387 |
6 |
6799 |
387 |
次の図は、SSL を使用した静的コンテンツのスケーラビリティーを示すグラフ表示です。
このテストは、SSL モードで CGI 環境を出力する printenv.pl という名前の Perl スクリプトを使用して実行されました。SSL セッションキャッシュを有効にした状態で、SSL モードでテストを実行しました。目標は、サーバー上のコアを飽和させ、それぞれのスループットと応答時間を調べることでした。
次の表は、SSL Perl CGI テストの結果を示しています。
表 6–17 SSL パフォーマンステスト: Perl CGI のスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
303 |
329 |
4 |
580 |
344 |
6 |
830 |
361 |
次の図は、SSL を使用した Perl のスケーラビリティーを示すグラフ表示です。
このテストは、SSL モードで printenv という名前の C 実行可能ファイルにアクセスすることにより実行されました。この実行可能ファイルは、環境変数情報を出力します。SSL セッションキャッシュを有効にした状態で、SSL モードでテストを実行しました。目標は、サーバー上のコアを飽和させ、それぞれのスループットと応答時間を調べることでした。
次の表は、SSL CGI テストの結果を示しています。
表 6–18 SSL パフォーマンステスト: C CGI のスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
792 |
126 |
4 |
1499 |
133 |
6 |
2127 |
141 |
次の図は、SSL を使用した C CGI のスケーラビリティーを示すグラフ表示です。
このテストで使用された NSAPI モジュールは printenv2.so です。このモジュールは、NSAPI 環境変数を、応答全体を 2K バイトにするためのテキストとともに出力します。SSL セッションキャッシュを有効にした状態で、SSL モードでテストを実行しました。目標は、サーバー上のコアを飽和させ、それぞれのスループットと応答時間を調べることでした。
次の表は、SSL NSAPI テストの結果を示しています。
表 6–19 SSL パフォーマンステスト: NSAPI のスケーラビリティー
コアの数 |
平均スループット (ops/秒) |
平均応答時間 (ミリ秒) |
---|---|---|
2 |
2729 |
29 |
4 |
5508 |
30 |
6 |
7982 |
32 |
次の図は、SSL を使用した NSAPI のスケーラビリティーを示すグラフ表示です。
電子商取引アプリケーションは、データベースを利用してオンラインショッピングのシミュレーションを行う、より複雑なアプリケーションです。
電子商取引の調査は、次のハードウェアを使用して実行されました。
Web Server のシステム構成:
Sun Microsystems Sun Fire 880 (900MHz US-III+)。このテストには 4 個の CPU のみを使用しました。
16384M バイトのメモリー
Solaris 10 オペレーティングシステム
データベースのシステム構成:
Sun Microsystems Sun Fire 880 (900MHz US-III+)
16384M バイトのメモリー
Solaris 10 オペレーティングシステム
Oracle 10.1.0.2.0
ドライバのシステム構成:
Sun Microsystems Sun Fire 880 (900MHz US-III+)
Solaris 10 オペレーティングシステム
ネットワーク構成:
Web Server、データベース、およびドライバマシンをギガビット Ethernet リンクで接続しました。
電子商取引テストは、次のチューニング設定を使用して実行されました。
JDBC のチューニング:
<jdbc-resource> <jndi-name>jdbc/jwebapp</jndi-name> <datasource-class>oracle.jdbc.pool.OracleDataSource</datasource-class> <max-connections>200</max-connections> <idle-timeout>0</idle-timeout> <wait-timeout>5</wait-timeout> <connection-validation>auto-commit</connection-validation> <property> <name>username</name> <value> db_user </value> </property> <property> <name>password</name> <value> db_password </value> </property> <property> <name>url</name> <value>jdbc:oracle:thin:@db_host_name:1521:oracle_sid</value> </property> <property> <name>ImplicitCachingEnabled</name> <value>true</value> </property> <property> <name>MaxStatements</name> <value>200</value> </property> </jdbc-resource
JVM のチューニング:
-server -Xmx1500m -Xms1500m -Xss128k -XX:+DisableExplicitGC
このテストでは、大量のインベントリからアイテムを販売する電子商取引 Web サイトをモデル化しました。その実装には、標準的な Web アプリケーションのモデル/表示/制御のデザインパターンを使用しています。ユーザーインタフェース (つまり、表示) は、1 つのマスター制御サーブレットとインタフェースする 16 種類の JSP ページで処理されます。このサーブレットは、モデルとして機能して 27 種類のクエリーを処理するデータベースへの JDBC 接続を維持しています。これらの JSP ページは JSP タグライブラリを広範囲に使用しており、ほぼ 2000 行のロジックで構成されます。
データベースには、1000 個の注文可能なアイテム (やはり 1000 のカーディナリティーを持つ 2 つの関連するテーブルがある)、72000 の顧客 (2 つの関連するテーブルがある)、および 190 万の注文 (2 つの関連するテーブルがある) が含まれています。標準の JDBC 接続が、準備済み文と次の標準の JDBC 設計原則を使用してデータベース接続を処理します。
ランダムに選択されたユーザーがオンラインショッピングを実行します。複合作業負荷で次の操作が使用されました。各操作は、操作の優先順位に従って実行されました。Home、AdminConfirm、AdminRequest、BestSellers、BuyConfirm、BuyRequest、CustomerRegistration、NewProducts、OrderDisplay、OrderInquiry、ProductDetail、SearchRequest、SearchResults、および ShoppingCart。
読み込みの起動には Faban ドライバを使用しました。思考時間を負の指数分布から選択しました。最小の思考時間は 7.5 秒、最大の思考時間は 75 秒でした。システムがサポートできる並行ユーザーの最大数を、次の合格条件に基づいて決定しました。
表 6–20 パフォーマンステストの合格条件
トランザクション |
90 パーセンタイルの応答時間 (秒) |
---|---|
HomeStart |
3 |
AdminConfirm |
20 |
AdminRequest |
3 |
BestSellers |
5 |
BuyConfirm |
5 |
BuyRequest |
3 |
CustomerRegistration |
3 |
Home |
3 |
NewProducts |
5 |
OrderDisplay |
3 |
OrderInquiry |
3 |
ProductDetail |
3 |
SearchRequest |
3 |
SearchResults |
10 |
ShoppingCart |
3 |
次の表は、電子商取引 Web アプリケーションテストの結果を示しています。
表 6–21 電子商取引 Web アプリケーションのスケーラビリティー
CPU の数 |
ユーザー |
スループット (ops/秒) |
---|---|---|
2 |
7000 |
790 |
4 |
11200 |
1350 |
次の図は、電子商取引 Web アプリケーションのスケーラビリティーを示すグラフ表示です。
次の図は、電子商取引 Web アプリケーションのスケーラビリティーを示すグラフ表示です。