ablog

不器用で落着きのない技術者のメモ

tcp_conn_req_max_q0 と tcp_conn_req_max_q と QUEUESIZE

接続要求を受信すると、TCP はまず、受け付けられるのを待っている保留状態の TCP 接続 (3 段階ハンドシェークが終わっている) の数 (N) が、そのリスナーに対する最大数を超えていないかをチェックします。接続数が超えていると、その要求は拒否されます。超えていなければ、TCP は、不完全な保留状態の TCP 接続の数が、N と tcp_conn_req_max_q0 の合計を超えていないかをチェックします。超えていなければ、その要求は受け付けられます。超えていると、最も古い不完全な保留状態の TCP 要求がドロップされます。

tcp_conn_req_max_q0 (Solaris カーネルのチューンアップ・リファレンスマニュアル)

ハンドシェイクのキューの長さの増加
TCP接続のハンドシェイク中、サーバーは、クライアントからリクエストを受信した後、応答を送信し、クライアントからの応答を待機します。クライアントがサーバーのメッセージに応答すると、ハンドシェイクは完了します。クライアントから最初のリクエストを受信すると、サーバーはリスニング・キューにエントリを作成します。クライアントがサーバーのメッセージに応答すると、完了したハンドシェイクのメッセージのキューに移動されます。リクエストは、サーバーがサービスを行うリソースを確保するまでの間、ここで待機します。

完了していないハンドシェイクのキューの最大長は、tcp_conn_req_max_q0によって決定されます。デフォルトは1024です。完了したハンドシェイクのリクエストのキューの最大長は、tcp_conn_req_max_qで定義されます。デフォルトは128です。

ほとんどのWebサーバーではデフォルトで十分ですが、同時ユーザーが数百人以上いる場合、これらの設定では低すぎる可能性があります。その場合、キューがいっぱいであるため、接続はハンドシェイクの段階で排除されます。この問題がご使用のシステムで発生するかどうかを判断するには、netstat -sを使用して、tcpListenDrop、tcpListenDropQ0およびtcpHalfOpenDropの値を調べます。最初の2つの値がゼロではない場合、最大値を増加する必要があります。

おそらくデフォルト値で十分ですが、オラクル社ではtcp_conn_req_max_qの値を1024に増やすことをお薦めします。これらのパラメータを設定するには、次のコマンドを使用します。

Solarisオペレーティング・システムでの設定

% /usr/sbin/ndd -set /dev/tcp tcp_conn_req_max_q 1024
% /usr/sbin/ndd -set /dev/tcp tcp_conn_req_max_q0 1024

HP-UXでの設定

prompt>/usr/sbin/ndd-set /dev/tcp tcp_conn_req_max 1024
Oracle HTTP Serverの最適化