HTTPAPI | FineTune

TsgcWSServer_HTTPAPITsgcServerHTTPAPI_FineTune 型の FineTune という名前の published プロパティを公開します。このプロパティは、Windows HTTP Server API (http.sys) がリクエストをキュー、ディスパッチ、完了する方法に影響するカーネルモードの低レベル設定をグループ化します。

 

QueueLength

HttpServerQueueLengthProperty カーネル設定をラップします。サーバーがデキューする前に http.sys がカーネルモードキューに保持する保留中のリクエストの最大数を制御します。キューがいっぱいになると、カーネルはユーザーモードに到達することなく、新しい接続に直接 503 Service Unavailable で応答します。

 

Type: ULONG。

Default: 1000(Windowsカーネルのデフォルト)。

Range: 最大 65535 リクエスト。

改善される点: この値を大きくすると、バースト性のあるワークロードでカーネルが正当なトラフィックを拒否するのを防ぐことができます。ネットワーク障害後に再接続する IoT フリート、プロバイダーのリセット後に再接続するマーケットデータブロードキャストクライアント、あるいは共有のcronティックで一斉に接続するスケジュールジョブワーカーなどに有効です。

 

SkipIOCPOnSuccess

Trueに設定すると、サーバーはリクエストキューハンドルに対して、フラグFILE_SKIP_COMPLETION_PORT_ON_SUCCESSFILE_SKIP_SET_EVENT_ON_HANDLEを指定してSetFileCompletionNotificationModesを呼び出します。同期的に完了するリクエストキュー上のオーバーラップI/O操作は、I/O完了ポートに追加の完了パケットを投稿しなくなります。

 

Type: Boolean。

デフォルト: False(フラグが設定されておらず、現在の動作が維持されます)。

改善される点: 呼び出しが NO_ERROR を同期的に返す場合、ホットリクエストパスでのカーネルからユーザーモードへのホップを排除します。ワーカーは IOCP パケットを待たずに、呼び出し元スレッドで完了をインラインでディスパッチします。これは Microsoft のリファレンス HTTP サーバー高パフォーマンスサンプルで使用されているパターンです。このフラグは OperatingMode = ompHighPerf と組み合わせて使用することを目的としています。

 

API は kernel32 から GetProcAddress を通じて実行時に解決されます。Windows XP 以前(Delphi 7 ランタイムターゲット)ではエントリポイントが存在しないため、ラッパーは False を返し、サーバーはフラグを設定せずに実行されます。

 

OperatingMode

2つのaccept/dispatchアーキテクチャのいずれかを選択します。

 

Type: TsgcHTTPAPIOperatingMode = (ompClassic, ompHighPerf)。

デフォルト値: ompClassic。

 

 

改善される点: ompHighPerf は、サーバーが深いシングルストリームパイプライン(大きなフレームのアップロード/ダウンロード)または多数の同時クライアント(数百から数千)を処理する場合に効果を発揮します。事前ポスト受信ウィンドウは接続ごとのアロケーションなしにバーストを吸収し、インラインディスパッチはアクセプターのハンドオフボトルネックを除去します。低トラフィック API や開発環境にはデフォルトの ompClassic を使用してください。軽負荷ではトラフィックの少ないワークロードで 128 の事前ポストコンテキストを維持するオーバーヘッドは節約より大きくなります。このモードはサーバーが有効化される前にのみ変更できます。

 

HighPerfAcceptsPerWorker

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;
  // dispatch inline on sync-success completions; skip the IOCP round-trip
  oServer.FineTune.SkipIOCPOnSuccess := True;
  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;