HTTP.SYS 高性能调优

· 功能

sgcWebSockets 2026.5.0 起,TsgcWSServer_HTTPAPI 组件新增了一个已发布属性 FineTune,其类型为 TsgcServerHTTPAPI_FineTune。该属性汇集了影响 Windows HTTP Server API(http.sys)请求排队、调度和完成方式的所有底层内核模式调节选项。此前,这些选项在组件中要么不存在,要么是硬编码的——现在它们已发布并可随窗体持久化,且支持在设计时进行调整。

FineTune 属性是一个 TPersistent 容器,包含四个子属性:QueueLengthSkipIOCPOnSuccessOperatingModeHighPerfAcceptsPerWorker。每个子属性的默认值均保持现有行为,因此升级到 2026.5.0 无需任何代码修改;您可以根据特定工作负载的需求单独选择启用各项调整。

FineTune 属性

QueueLength:ULONG(默认值 1000)

功能说明。 封装 HttpServerQueueLengthProperty 内核设置。该属性控制 http.sys 在服务器取出请求之前,其内核模式队列中可保存的最大待处理请求数量。当队列已满时,内核会直接以 503 Service Unavailable 响应新连接,而不会到达用户模式。

改善效果。 在突发性工作负载场景下——例如网络故障后数千台 IoT 设备同时重连、集群部署推送或市场开盘时的流量峰值——提高 QueueLength 可防止内核在您的进程察觉之前便拒绝客户端连接,从而避免客户端级联重试。默认值 1000 与 Windows 内核默认值一致,对于现代工作负载而言较为保守;有效范围最高可达 65535。

SkipIOCPOnSuccess:Boolean(默认值 False)

功能说明。 设置为 True 时,通过 SetFileCompletionNotificationModes 在请求队列句柄上启用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESSFILE_SKIP_SET_EVENT_ON_HANDLE 标志。当重叠 I/O 操作同步完成时,内核将跳过向 IOCP 投递完成包的步骤。

改善效果。 当调用同步返回 NO_ERROR 时,消除热请求路径上从内核到用户模式的切换开销——工作线程在调用线程上内联分发完成事件,而无需等待 IOCP 包。这是 Microsoft 参考"HTTP Server High Performance"示例所采用的模式。默认值 False 是有意为之:启用该标志需要调用方处理内联完成事件。该属性适合与 OperatingMode = ompHighPerf 配合使用,适用于吞吐量提升效益足以弥补额外代码路径开销的工作负载。

OperatingMode:TsgcHTTPAPIOperatingMode(默认值 ompClassic)

功能说明。 选择以下两种接受/调度架构之一:

改善效果。 当服务器面临深层单流管道(大帧上传/下载)或大量并发客户端(数百至数千个)时,ompHighPerf 效果显著。预投递接收窗口可吸收突发流量而无需按连接分配,内联分发则消除了接受线程的交接瓶颈。对于低流量 API 和开发环境,建议保留默认值 ompClassic——在轻量负载下,维持 128 个预投递上下文的开销反而得不偿失。该模式只能在构造时更改;不支持在单个进程生命周期内混用模式。

HighPerfAcceptsPerWorker:Integer(默认值 4)

功能说明。 控制 OperatingMode = ompHighPerf 时每个 IOCP 工作线程预投递的异步接收数量。在 ompClassic 模式下该值被忽略。服务器维持的并发挂起接收总数等于 ThreadPoolSize × HighPerfAcceptsPerWorker

改善效果。 更深的每工作线程窗口使服务器能够吸收更大的传入请求突发量,而无需在热路径上分配新上下文。对于高并发部署(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;