自 sgcWebSockets 2026.5.0 起,TsgcWSServer_HTTPAPI 组件新增了一个已发布属性 FineTune,其类型为 TsgcServerHTTPAPI_FineTune。该属性汇集了影响 Windows HTTP Server API(http.sys)请求排队、调度和完成方式的所有底层内核模式调节选项。此前,这些选项在组件中要么不存在,要么是硬编码的——现在它们已发布并可随窗体持久化,且支持在设计时进行调整。
FineTune 属性是一个 TPersistent 容器,包含四个子属性:QueueLength、SkipIOCPOnSuccess、OperatingMode 和 HighPerfAcceptsPerWorker。每个子属性的默认值均保持现有行为,因此升级到 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_SUCCESS 和 FILE_SKIP_SET_EVENT_ON_HANDLE 标志。当重叠 I/O 操作同步完成时,内核将跳过向 IOCP 投递完成包的步骤。
改善效果。 当调用同步返回 NO_ERROR 时,消除热请求路径上从内核到用户模式的切换开销——工作线程在调用线程上内联分发完成事件,而无需等待 IOCP 包。这是 Microsoft 参考"HTTP Server High Performance"示例所采用的模式。默认值 False 是有意为之:启用该标志需要调用方处理内联完成事件。该属性适合与 OperatingMode = ompHighPerf 配合使用,适用于吞吐量提升效益足以弥补额外代码路径开销的工作负载。
OperatingMode:TsgcHTTPAPIOperatingMode(默认值 ompClassic)
功能说明。 选择以下两种接受/调度架构之一:
ompClassic— 单一接受线程同步调用HttpReceiveHttpRequest,并通过PostQueuedCompletionStatus将每个请求手动分发至 IOCP 工作线程池。这是历史沿用的行为。ompHighPerf— 实现 Microsoft 参考"HTTP Server High Performance"模式。接受线程被完全移除。启动时,服务器在绑定 IOCP 的队列上预投递ThreadPoolSize × HighPerfAcceptsPerWorker个异步接收(默认为 32 × 4 = 128 个并发挂起接收)。每个工作线程内联处理完成事件并重新投递另一个异步接收,在关闭之前保持滑动窗口。
改善效果。 当服务器面临深层单流管道(大帧上传/下载)或大量并发客户端(数百至数千个)时,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;
