Indy 服务器为每个连接分配一个线程,这意味着如果服务器需要处理 1000 个并发连接,就会创建 1000 个线程。若连接数达到 10,000,就会创建 10,000 个线程,以此类推……当然,这需要呈指数级增长的硬件资源,无法应对高负载服务器的需求。
Windows 提供了一个名为 IOCP 的 API,允许用少量线程池处理数千个连接。
自 sgcWebSockets 4.3.3 起,Indy 服务器开始支持 IOCP:
- TsgcWebSocketServer
- TsgcWebSocketHTTPServer
配置
要为 Indy 服务器启用 IOCP,请前往 IOHandlerOptions 属性,并将 IOHandler 类型选择为 iohIOCP。
Server.IOHandlerOptions.IOHandlerType := iohIOCP; Server.IOHandlerOptions.IOCP.IOCPThreads := 8; Server.IOHandlerOptions.IOCP.WorkOpThreads := 32;
IOCPThreads 是用于 IOCP 异步请求(重叠操作)的线程,WorkOpThreads 是用于处理这些异步请求(读写字节)的线程。WorkOpThreads 的最大值为 64,但您应根据物理处理器数量 × 2 来调整该值;例如,若 CPU 有 16 个处理器,则将 WorkOpThreads 设置为 32。当需要处理数千个连接时,建议为 Windows 服务器启用 IOCP;若服务器最多仅处理 100 个并发连接,则可以保持默认的 Indy 线程模型。
