TsgcWSServer_HTTPAPI は TsgcServerHTTPAPI_FineTune 型の FineTune という名前の published プロパティを公開します。このプロパティは、Windows HTTP Server API (http.sys) がリクエストをキュー、ディスパッチ、完了する方法に影響するカーネルモードの低レベル設定をグループ化します。
HttpServerQueueLengthProperty カーネル設定をラップします。サーバーがデキューする前に http.sys がカーネルモードキューに保持する保留中のリクエストの最大数を制御します。キューがいっぱいになると、カーネルはユーザーモードに到達することなく、新しい接続に直接 503 Service Unavailable で応答します。
Type: ULONG。
Default: 1000(Windowsカーネルのデフォルト)。
Range: 最大 65535 リクエスト。
改善される点: この値を大きくすると、バースト性のあるワークロードでカーネルが正当なトラフィックを拒否するのを防ぐことができます。ネットワーク障害後に再接続する IoT フリート、プロバイダーのリセット後に再接続するマーケットデータブロードキャストクライアント、あるいは共有のcronティックで一斉に接続するスケジュールジョブワーカーなどに有効です。
このオプションはサポートされておらず、設定しても効果はありません。このプロパティは互換性のためにのみ保持されており、これを使用する既存のフォームやコードは引き続き読み込まれます。
Type: Boolean。
デフォルト: False。
サポートされない理由: サーバーのオーバーラップI/Oは、呼び出しがすぐに成功する場合でも、すべての呼び出しに対して完了パケットに依存しています。
2つのaccept/dispatchアーキテクチャのいずれかを選択します。
Type: TsgcHTTPAPIOperatingMode = (ompClassic, ompHighPerf)。
デフォルト値: ompClassic。
HttpReceiveHttpRequest を同期的に呼び出し、PostQueuedCompletionStatus を介して各リクエストを IOCP ワーカープールに手動でディスパッチします。これは従来の動作です。ThreadPoolSize x HighPerfAcceptsPerWorker の非同期受信を事前にポストします (デフォルト 32 x 4 = 128 の同時未処理受信)。各ワーカーはインラインで完了を処理し、別の非同期受信を再ポストして、シャットダウンまでスライディングウィンドウを維持します。
改善される点: ompHighPerf は、サーバーが深いシングルストリームパイプライン(大きなフレームのアップロード/ダウンロード)または多数の同時クライアント(数百から数千)を処理する場合に効果を発揮します。事前ポスト受信ウィンドウは接続ごとのアロケーションなしにバーストを吸収し、インラインディスパッチはアクセプターのハンドオフボトルネックを除去します。低トラフィック API や開発環境にはデフォルトの ompClassic を使用してください。軽負荷ではトラフィックの少ないワークロードで 128 の事前ポストコンテキストを維持するオーバーヘッドは節約より大きくなります。このモードはサーバーが有効化される前にのみ変更できます。
OperatingMode = ompHighPerf の場合に各IOCPワーカーが事前にポストする非同期受信数を制御します。ompClassic モードでは値は無視されます。サーバーが維持する同時未処理受信の合計数は ThreadPoolSize x HighPerfAcceptsPerWorker です。
Type: 整数。
デフォルト: 4。
改善される点: ワーカーごとのウィンドウを深く設定することで、サーバーはホットパスで新しいコンテキストを割り当てることなく、大量の着信リクエストのバーストを吸収できます。高並列デプロイメント(IoT フリート、市場データ配信、ファンアウトブローカー)では値を大きくしてください。トレードオフはメモリです。事前にポストされた各受信には、完了するまで予約されるリクエストバッファ(約 16 KB)が保持されます。デフォルトの 4 は MSDN HP サンプルに基づいて検証された保守的な中間値です。
以下のスニペットは、高並行性 IoT バックエンド向けに HTTP.sys サーバーを設定しています。再接続ストームを吸収するための大きなカーネルキューと、拡張された事前ポスト受信ウィンドウを持つ HighPerf ディスパッチを使用します。
uses
sgcWebSocket_Server_HTTPAPI,
sgcWebSocket_HTTPAPI_Server; // TsgcHTTPAPIOperatingMode
var
oServer: TsgcWSServer_HTTPAPI;
begin
oServer := TsgcWSServer_HTTPAPI.Create(nil);
oServer.Host := '0.0.0.0';
oServer.Port := 8080;
// absorb 10,000-device reconnect bursts before kernel-level 503
oServer.FineTune.QueueLength := 10000;
// switch from single-acceptor to pre-posted IOCP workers
oServer.FineTune.OperatingMode := ompHighPerf;
// widen the per-worker pre-posted receive window (32 threads * 8 = 256)
oServer.FineTune.HighPerfAcceptsPerWorker := 8;
oServer.Active := True;
end;
典型的な内部または低トラフィック API の場合、すべての FineTune プロパティをデフォルトのままにします:
oServer := TsgcWSServer_HTTPAPI.Create(nil);
oServer.Host := 'localhost';
oServer.Port := 8080;
// FineTune defaults: QueueLength=1000, SkipIOCPOnSuccess=False,
// OperatingMode=ompClassic, HighPerfAcceptsPerWorker=4
oServer.Active := True;