ヘッダーをスキップ

Oracle Application Server パフォーマンス・ガイド
10gリリース3(10.1.3.1.0)

B31836-02
目次
目次
索引
索引

戻る 次へ

6 Oracle HTTP Serverの最適化

この章では、Oracle Application ServerにおけるOracle HTTP Serverの最適化のテクニックについて説明します。

この章には、次の項が含まれています。

6.1 Oracle HTTP Serverディレクティブの構成

アプリケーション・サーバーを構成するために、Oracle HTTP Serverではhttpd.confのディレクティブを使用します。この構成ファイルでは、同時に処理できるHTTPリクエストの最大数、ロギングの詳細、制限およびタイムアウトを指定します。

表6-1に、パフォーマンスに大きな影響を与えるディレクティブをまとめます。

表6-1    Oracle HTTP Serverの構成プロパティ 
ディレクティブ  説明 

ListenBackLog 

保留中の接続のキューの最大長を指定します。通常、チューニングする必要はありません。一部のオペレーティング・システムでは、ListenBacklogで指定した数値そのものではなく、設定に基づく数値(通常はそれより大きな数値)が使用されます。

デフォルト値: 511 

MaxClients 

実行可能なサーバーの総数、すなわち同時に接続可能なクライアントの数を制限します。クライアントの接続数がこの制限に達した場合、後続のリクエストは、ListenBackLogディレクティブで指定したキューの最大長に達するまで、TCP/IPシステムのキューに格納されます(保留中の接続のキューが一杯になると、プロセスが使用可能になるまで新しいリクエストは接続エラーになります)。

MaxClientsに使用できる最大数は、8192(8K)です。

デフォルト値: 150 

MaxRequestsPerChild 

各子プロセスが終了するまでに処理可能なリクエストの数です。Apache(およびApacheが使用するライブラリ)がメモリーやその他のリソースを浪費する場合に、長期間使用した結果生じる問題を避けるために、子プロセスを終了します。大部分のシステムではほとんど必要ありませんが、UNIXなどのいくつかのシステムでは無視できないリークがライブラリで発生します。このようなプラットフォームの場合は、MaxRequestsPerChildに10000程度の値を設定してください。0を設定すると無制限になります。

この値には、各接続の初期リクエストに続くKeepAliveリクエストは含まれません。たとえば、子プロセスが初期リクエストと、それに続く10個のkeep aliveリクエストを処理した場合、この制限に関しては1個のリクエストとしてのみカウントされます。

注意: Windowsシステムでは、MaxRequestsPerChildは常に0(無制限)に設定する必要があります。Windows上に存在するサーバー・プロセスは1つのみなので、このプロセスを制限しないでください。 

MaxSpareServers

MinSpareServers

 

サーバーのプール・サイズの規定値です。Oracle HTTP Serverでは、検出した負荷に動的に適応するため、必要なサーバーのプロセス数を予測する必要はありません。つまり、現在の負荷の処理に十分なサーバー・プロセス数に加えて、一時的な負荷の増加(たとえば、1つのNetscapeブラウザから複数のリクエストが同時に行われる場合)に備えていくつかの予備サーバーが維持されます。

これは、いくつのサーバーがリクエスト待ちの状態にあるかを定期的にチェックすることで実現されています。待機中のサーバー数がMinSpareServersよりも少ない場合、新規の予備サーバーを作成します。待機サーバー数がMaxSpareServersよりも多い場合は、予備サーバーのいくつかを終了させます。

ほとんどのサイトでは、次のデフォルト値のままで問題ありません。

デフォルト値:

MaxSpareServers: 10

MinSpareServers: 5 

StartServers 

最初に起動するサーバーの数です。起動後に急激な負荷が予想される場合は、そのときに必要な子サーバーの数を基準にしてこの値を設定してください。

デフォルト値: 5 

Timeout 

受信および送信がタイムアウトするまでの秒数です。

デフォルト値: 300 

KeepAlive 

永続的な接続(1回の接続について複数のリクエストを送信する接続)を許可するかどうかを設定します。解除するにはOffに設定します。

デフォルト値: On 

MaxKeepAliveRequests 

永続的な接続の間に許可するリクエストの最大数です。0に設定すると無制限になります。

クライアントとのセッションが長い場合、この値を増やすことができます。

デフォルト値: 100 

KeepAliveTimeout 

1つの接続において同じクライアントからの次のリクエストを待機する秒数です。

デフォルト値: 15秒 

6.1.1 永続的な接続によるhttpdプロセスの可用性の低下

KeepAliveディレクティブのデフォルトの設定は、次のとおりです。

KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeOut 15

これらの設定により、永続的な接続の欠点を最小限に抑えながら、利点を活用できるように、接続当たりのリクエストおよびリクエスト間の時間が設定されています。ご使用のシステムでこれらの値を設定する際は、ご使用のシステムのユーザー数と作業内容を考慮する必要があります。たとえば、ユーザー数は多いが、ユーザーが送信するリクエストが小さく頻度が低い場合は、KeepAliveディレクティブのデフォルト設定値を小さくするか、またはKeepAliveをoffに設定します。ユーザー数が少なく、サイトに頻繁にアクセスする場合は、設定値を大きくします。

6.2 Oracle HTTP Serverのロギング・オプション

この項では、ロギングのタイプ、ログ・レベル、さらにロギングの使用によるパフォーマンスへの影響について説明します。

6.2.1 アクセス・ロギング

静的ページのリクエストの場合、デフォルト・フィールドのアクセス・ロギングにより、パフォーマンス・コストが2〜3%増加します。

6.2.2 HostNameLookupsディレクティブの構成

デフォルトでは、HostNameLookupsディレクティブはOffに設定されています。サーバーにより、着信リクエストのIPアドレスがログ・ファイルに書き込まれます。HostNameLookupsがOnに設定されると、サーバーは各リクエストのIPアドレスに関連付けられたホスト名をインターネット上のDNSシステムに問い合せ、ホスト名をログに書き込みます。

オラクル社のテストで、HostNameLookupsをOnに設定したところ、パフォーマンスは約3%(最良の場合)低下しました。サーバーの負荷とご使用のDNSサーバーへのネットワーク接続状況により、DNS検索のパフォーマンス・コストが高くなる可能性があります。ログ中にリアル・タイムでホスト名が必要な場合以外は、IPアドレスでログを行うことをお薦めします。

UNIXシステムでは、$ORACLE_HOME/Apache/Apache/bin/ディレクトリにあるlogresolveユーティリティを使用して、オフラインでIPアドレスをホスト名に解決できます。

6.2.3 エラーのロギング

サーバーにより、エラー・ログに異常なアクティビティが記録されます。ErrorLogおよびLogLevelディレクティブにより、ログ・ファイルと、記録されるメッセージの詳細レベルを指定します。デフォルトのレベルはwarnです。負荷のかかったシステムにおける静的ページのパフォーマンスでは、warninfoおよびdebugのレベルで違いはありませんでした。

動的リソースを使用するリクエストの場合(たとえばmod_ossomod_plsql、またはmod_oc4jを使用するリクエスト)、debugレベルなどのより高位のデバッグ・レベルの設定によりパフォーマンス・コストが発生します。

6.3 Oracle HTTP Serverのセキュリティ・パフォーマンスの考慮事項

この項には、次の項目が含まれています。

6.3.1 Oracle HTTP ServerにおけるSecure Sockets Layer(SSL)のパフォーマンスに関する問題

Secure Sockets Layer(SSL)は、Netscape社によって開発されたプロトコルで、インターネット上での認証と暗号化による通信を提供します。概念的には、SSLはプロトコル・スタックのアプリケーション層とトランスポート層の中間に存在します。SSLは技術的にはアプリケーションに依存しないプロトコルですが、HTTPを介したセキュリティの提供が標準となった現在では、すべての主要なWebブラウザでSSLがサポートされています。

SSLは、Webベースのアプリケーションのレスポンス能力とスケーラビリティの両方でボトルネックとなる可能性があります。SSLが要求される場合、プロトコルのパフォーマンスに関する問題を慎重に考慮する必要があります。SSLプロトコルを使用する場合、特にセッションの作成および始動などのセッション管理が、最もパフォーマンス・コストのかかる部分です。

この項には、次のSSLパフォーマンス関連の情報が含まれています。

6.3.1.1 Oracle HTTP ServerのSSLキャッシュ

SSL接続が開始されると、クライアントとサーバー間のハンドシェイクに基づくセッションが発生します。これには暗号スイートのネゴシエーション、データ暗号化用の秘密鍵の交換、およびデジタル署名証明書を介したサーバーおよび任意のクライアントの認証が含まれます。

SSLのセッション状態がクライアントとサーバー間で開始された後は、サーバーによってセッション状態を保存および再利用できるので、後続のSSLリクエストでセッションを確立しハンドシェイクを作成する必要がなくなります。Oracle HTTP Serverでは、デフォルトでクライアントのSSL(Secure Sockets Layer)セッション情報をキャッシュします。セッション・キャッシュを使用すると、待ち時間が長いのはサーバーへの最初の接続時のみになります。

httpd.confSSLSessionCacheTimeoutディレクティブにより、サーバーで保存されたSSLセッションを保持する期間を指定します(デフォルトは300秒です)。セッション状態は、指定した時間の経過後に使用されない場合は廃棄されます。そして、後続のSSLリクエストでは新しいSSLセッションを確立し、もう一度ハンドシェイクを開始する必要があります。SSLSessionCacheディレクティブでは、SSLセッション情報の保存場所を指定します。デフォルトの保存場所は、UNIXシステムでは$ORACLE_HOME/Apache/Apache/logs/ディレクトリで、Windowsシステムでは%ORACLE_HOME%¥Apache¥Apache¥logs¥です。保存されたセッション・キャッシュ・ファイルは、複数のOracle HTTP Serverプロセスで使用可能です。

SSLのセッション状態を保存すると、SSLを使用したアプリケーションのパフォーマンスが大幅に改善します。たとえば、SSL対応のサーバーで接続と切断の簡単なテストを行ったところ、SSLセッション・キャッシュを使用しない場合、5回の接続に要した時間は11.4秒でした。SSLセッション・キャッシュを使用可能にした場合、5回の往復に要した時間は1.9秒でした。

保存されたSSLのセッション状態を再利用する場合は、いくつかのパフォーマンス・コストが発生します。SSLのセッション状態をディスクに保存した場合、保存されたセッション状態を再利用するには、通常ディスクから関連するセッション状態を検出し、取得する必要があります。永続的なHTTP接続を使用すれば、このパフォーマンス・コストを削減できます。永続的なHTTP接続がクライアント側でサポートされている場合、Oracle HTTP Serverでは、この接続がデフォルトで使用されます。Oracle HTTP Serverによって実装されるSSLを使用したHTTP接続では、SSLのセッション状態は、関連するHTTP接続が維持されている間メモリーに保存されます。このプロセスにより、SSLセッションの再利用によるオーバーヘッドが実質的に排除されます(概念的には、SSL接続はHTTP接続とともに維持されます)。

6.3.1.2 SSLによるアプリケーション・レベルのデータ暗号化

SSLを使用するほとんどのアプリケーションでは、データ暗号化のコストは、SSLセッション管理と比較して小さくなります。暗号化コストが著しく発生するのは、暗号化されたデータのボリュームが大きい場合です。そのような場合、データ暗号化アルゴリズムとSSLセッションに選択した鍵のサイズはきわめて大きくなります。

通常、セキュリティ・レベルとパフォーマンス間にはトレードオフが発生します。たとえば、最新のプロセッサでは、RSAはRC4暗号化が1出力バイト当たり8〜16の処理に対応すると見積っています。通常のDES暗号化ではRC4のおよそ8倍のオーバーヘッドが発生し、Triple-DESではDESのおよそ25倍のオーバーヘッドが発生します。ただし、Triple-DESを使用している場合、暗号化コストはほとんどのアプリケーションで顕著ではありません。Oracle HTTP Serverでは、これら3つの暗号スイートおよびその他の暗号スイートがサポートされています。

Oracle HTTP Serverでは、httpd.confで指定されているSSLCipherSuite属性に基づき、クライアントと暗号スイートをネゴシエートします。

関連項目

サポートされている暗号スイートの使用方法の詳細は、『Oracle HTTP Server管理者ガイド』を参照してください。 

6.3.1.3 SSLパフォーマンスの推奨事項

次の推奨事項は、Oracle HTTP ServerをSSLとともに使用する場合のパフォーマンス要件を決定する際に役立ちます。

  1. SSLハンドシェイクは、CPU使用量およびレスポンス時間の両方の点から本質的にコストのかかる処理です。したがって、必要な場合のみSSLを使用してください。セキュリティを必要とするアプリケーションの部分と要求されるセキュリティ・レベルを決定し、必要なセキュリティ・レベルでこれらの部分のみを保護します。SSLの使用を控え、可能なかぎりセッション状態を再利用して、SSLハンドシェイクの必要性を最小限にします。たとえば、ページ上に少量の機密データと多量の機密ではないグラフィック画像がある場合、SSLを使用して機密データのみを転送し、通常のHTTPを使用して画像を転送します。アプリケーションでサーバー認証のみを要求する場合、クライアント認証は使用しません。アプリケーションのパフォーマンス目標がこの方法だけでは実現できない場合、追加のハードウェアが必要な場合もあります。

  2. SSLを効果的に使用できるようにアプリケーションを設計します。セキュアな操作をグループ化して、SSLセッションおよびSSL接続を再利用します。

  3. 可能な場合は永続的な接続を使用して、SSLセッションの再利用のコストを最小限にします。

  4. セッション・キャッシュのタイムアウト値をチューニングします(httpd.confSSLSessionCacheTimeout属性)。SSLセッション・キャッシュを維持するコストと、新しいSSLセッションを確立するコストの間に、トレードオフが存在します。一般に、保護されたビジネス・プロセスまたはSSL交換の概念的なグループ化は、複数のセッションを作成せずに完了する必要があります。SSLSessionCacheTimeout属性のデフォルト値は、300秒です。アプリケーションの活用性をテストして、この設定のチューニングに役立ててください。

  5. 大量のデータがSSLを介して保護されている場合、使用されている暗号スイートに細心の注意を払ってください。httpd.confで指定されているSSLCipherSuiteディレクティブによって、暗号スイートを制御します。より低いレベルのセキュリティが許容される場合、より小さいサイズの鍵を使用する暗号強度の低いプロトコルを使用します(これによってパフォーマンスが大幅に改善します)。最後に、目的のセキュリティ・レベルを確保するために使用可能な暗号スイートをそれぞれ使用してアプリケーションをテストし、最もパフォーマンスの高い暗号スイートを検証します。

  6. 前述の考慮事項に配慮しても、SSLが引き続きアプリケーションのパフォーマンスとスケーラビリティのボトルネックである場合、ハードウェア・クラスタに複数のOracle HTTP Serverインスタンスを配置するか、SSLアクセラレータ・カードの使用を検討してください。

6.3.2 Oracle HTTP Serverポート・トンネリングのパフォーマンスに関する問題

OracleAS Port Tunnelingが構成されている場合、すべてのリクエストはOracleAS Port Tunnelingインフラストラクチャを経由して処理されます。つまりOracleAS Port Tunnelingは、Oracle HTTP Serverのリクエスト処理に関わるパフォーマンスおよびスケーラビリティ全体に大きく影響します。

実行されるOracleAS Port Tunnelingプロセスの数を除き、OracleAS Port Tunnelingのパフォーマンスは自動的に調整されます。唯一可能なパフォーマンス制御は、より多くのOracleAS Port Tunnelingプロセスを開始することです。これにより、使用可能な接続の数が増え、システムのスケーラビリティが増大します。

OracleAS Port Tunnelingプロセスの数は、プロセスが必要とされる度合いや期待される接続数に基づきます。プロセスを追加するたびに、DMZとイントラネット間のファイアウォールを介して新しいポートをオープンする必要があるので、この数を自動的に決定することはできません。オープンしたポートよりも多くのプロセスは開始できません。また、オープンしたポートよりも少ないプロセスも好ましくありません。この場合、プロセスが割り当てられないポートが存在することになります。

OracleAS Port Tunnelingのパフォーマンスを測定するには、OracleAS Port Tunnelingインフラストラクチャを経由するサーブレット・リクエストのリクエスト時間を判断します。OracleAS Port Tunnelingを使用した場合とそうでない場合のOracle Application Serverインスタンスのレスポンス時間を比較して、OracleAS Port Tunnelingによってパフォーマンス要件が満たされているかどうかを確認する必要があります。

関連項目

OracleAS Port Tunnelingの構成の詳細は、『Oracle HTTP Server管理者ガイド』を参照してください。 

6.4 Oracle HTTP Serverのパフォーマンスのヒント

次のヒントを利用すると、Oracle HTTP Server(OHS)のパフォーマンスの潜在的な問題の回避やデバッグが可能になります。

6.4.1 静的リクエストと動的リクエストの比較

サーバーがどこでリソースを消費しているのかを把握すれば、チューニングに対する労力を問題の主な原因となっている箇所に集中できます。システムを構成する際は、着信リクエストの何パーセントが静的なもので何パーセントが動的なものかを知ることが役に立つ場合があります。

一般的に、生成のコストが余計にかかることの多い動的なページのチューニングに時間をかけることが多いようです。アプリケーションの監視とチューニングを行うことで、カタログ・データなどの動的に生成されたコンテンツの多くがキャッシュ可能であり、リソースの使用量を大幅に節減できることも明らかになります。

6.4.2 Oracle HTTP ServerとOC4Jサーバー間の時間差の分析

状況によっては、Oracle Containers for J2EE(OC4J)のリクエストの平均処理時間と、ユーザーが経験する平均レスポンス時間に大きな開きがあるかもしれません。OC4Jでの実際の処理に時間が費やされているのでなければ、おそらく転送に時間がかかっています。

OC4Jのリクエスト処理時間と平均レスポンス時間の差が大きい場合は、「Oracle HTTP Serverディレクティブの構成」に記述されているOracle HTTP Serverディレクティブをチューニングしてください。

6.4.3 不正確な結果の要因となる1つのデータに対する注意

データに外れ値があると、状態を正確に反映していない結果を得る場合があります。外れ値は、起動時に発生することがよくあります。簡単な例をシミュレートするため、PL/SQLのHello, Worldアプリケーションを約30秒間実行したとします。結果を調べてみると、処理はすべてmod_plsql.c内で次のように行われていました。

 /ohs_server/ohs_module/mod_plsql.c
   handle.maxTime:     859330
   handle.minTime:      17099
   handle.avg:          19531
   handle.active:           0
   handle.time:      24023499
   handle.completed:     1230

ここで、handle.maxTimeの値がhandle.avgよりもはるかに大きい点に注意してください。これは、おそらく最初のリクエストを受信したときに、データベースとの接続をオープンする必要があったためです。それ以降のリクエストは、すでに確立した接続を利用できます。この場合、より正確なPL/SQLモジュールの平均サービス時間を取得するには、handle.maxTime値を増加させていたデータベース接続のオープンにかかる時間を除外して、次のように平均を再計算します。

(time - maxTime)/(completed -1)

たとえば、この場合は次のようになります。

(24023499 - 859330)/(1230 -1) = 18847.98


戻る 次へ
Oracle
Copyright © 2001, 2008, Oracle.

All Rights Reserved.
目次
目次
索引
索引