オペレーティング・システムでは、ファイル・ディスクリプタを使用して、ファイルシステムのファイル、および接続やリスナー・ソケットなどの擬似ファイルを処理します。
Oracle Traffic Directorインスタンスの起動後、ファイル・ディスクリプタ関連の値の自動構成が行われる際に、次のパラメータが考慮されます。
HTTP処理スレッド(<thread-pool>
)
すべての仮想サーバーのアクセス・ログ件数(<access-log>
)
リスナー(<http-listener>、<tcp-listener>
)
キープ・アライブ接続(<keep-alive>
)
オリジン・サーバー・プールの数(<origin-server-pool>
)
オリジン・サーバーの数(<origin-server>
)
オリジン・サーバーの接続(<origin-server>/<max-connections>
)
TCP処理スレッド(<tcp-thread-pool>
)
ファイル・ディスクリプタを必要とする主要なOracle Traffic Directorオブジェクトは、キープ・アライブ接続、キューに入れられた接続、およびオリジン・サーバーへの接続です。これらのオブジェクトの制限を明示的に指定しない場合、Oracle Traffic Directorインスタンスが起動すると、制限(最大キープ・アライブ接続、接続キューのサイズ、および各オリジン・サーバーの最大接続数)が、システム内で使用可能なファイル・ディスクリプタの合計数に基づいて自動的に構成されます。
ファイル・ディスクリプタ制限に異常に高い値が設定されている場合、未指定のパラメータの自動構成が原因でOracle Traffic Directorインスタンスがメモリーを過剰消費したり、最適な構成を得られないことがあります。この問題を回避するため、ファイル・ディスクリプタ制限が高いシステムではこれらのパラメータ値を明示的に指定します。
たとえば、max-threads * 4
がプロセスで利用できる最大ファイル・ディスクリプタ数よりも小さくなるのが理想です。たとえば、ファイル・ディスクリプタ制限が65536に設定されている場合にmax-threads
を20000に設定すると、最適なチューニングを得られません。これは、ワーカー・スレッド用として80000 (20000*4=80000)がファイル・ディスクリプタを使い切って/予約してしまい、他のサブシステム用に残るファイル・ディスクリプタが少なくなるためです。そのため、max-threads
に高い値を設定する場合は、何回かテストを行ったうえで設定する必要があります。
割り当てられたファイル・ディスクリプタ数は、システムでサポート可能な制限を超えられません。ファイル・ディスクリプタの現在のシステム制限を確認するには、次のコマンドを実行します。
$ cat /proc/sys/fs/file-max 2048
使用可能なファイル・ディスクリプタのうち現在使用されている数を確認するには、次のコマンドを実行します。
$ cat /proc/sys/fs/file-nr
このコマンドによって、次のような出力が返されます。
625 52 2048
この例では、625
は割当て済ファイル・ディスクリプタ数、52
は空きの割当て済ファイル・ディスクリプタ数、2048
はシステムでサポートされているファイル・ディスクリプタの最大数です。
注意: Solarisでは次のコマンドを使用して、システム全体で使用中のファイル・ディスクリプタを検出できます。 # echo ::kmastat | mdb -k | grep file_cache このコマンドによって、次のような出力が返されます。 file_cache 56 1154 1305 73728B 659529 0 この例では、 |
割当て済ファイル・ディスクリプタがシステムの制限に達すると、ファイルを開くときに次のエラー・メッセージがシステム・コンソールに表示されます。
Too many open files in system.
次のメッセージがサーバー・ログに書き込まれます。
[ERROR:16] [OTD-10546] Insufficient file descriptors for optimum configuration.
これは、システムではこれ以上ファイルを開くことができないという重大な問題です。この問題を回避するために、ファイル・ディスクリプタ制限を合理的な数まで増やすことを検討してください。
Linuxでファイル・ディスクリプタ数を変更するには、次の操作をroot
ユーザーとして行います。
次の行を/etc/sysctl.conf
ファイルで編集します。
fs.file-max = value
value
は、設定する新しいファイル・ディスクリプタ制限です。
次のコマンドを実行して、変更を適用します。
# /sbin/sysctl -p
注意: Solarisでは、 たとえば、ハード面の制限値を上げるには、/etc/systemに次のコマンドを追加して、1回再起動します。 set rlim_fd_max = 65536 Solarisのファイル・ディスクリプタの設定の詳細は、第15.13.1項「単一のプロセスで開くファイル(ファイル・ディスクリプタの制限)」を参照してください。 |
thumbのおおよそのルールとして、thread-pool要素、max-threads * 4がプロセスで利用できる最大ファイル・ディスクリプタ数よりも小さくなるようにするというルールがあります。これはつまり、max-threadsを最大ファイル・ディスクリプタ数の1/5未満にするということです。
たとえば、ファイル・ディスクリプタ制限が65536に設定されている場合にmax-threadsを20000に設定すると、最適なチューニングを得られません。これは、ワーカー・スレッド用として20000*4=80000がファイル・ディスクリプタを使い切って/予約してしまい、他のサブシステム用にファイル・ディスクリプタがほとんど残らないためです。
max-threadsに高い値を設定する場合は、必ず事前にテストを行ってください。1つのプロセスに数万のスレッドが存在する状態はパフォーマンスに影響を及ぼすことがあります。