我有几台 Windows Server 2008 R2 计算机,它们充当客户端,并连接到同一数据中心的另一台服务器。我无法访问服务器。我需要尽量减少客户端和服务器之间的延迟。它们通过 Macromedia Flash (Winsockets) 进行通信并交换非常小的命令(20-30 字节)。通常的延迟是 200-400 微秒,但根据我的经验和一些测试(使用 MS Network Monitor 完成),似乎在 Flash 应用程序中,响应时间通常至少为几毫秒,这不是软件造成的。
我怀疑这可能是由于 Nagle 算法或延迟 ACK 造成的。我尝试通过注册表禁用这两者,但这似乎对 Server 2008 R2 没有影响。我知道我可以使用注册表调整 MTU 和其他一些值:DefaultSendWindow、DefaultReceiveWindow、GlobalMaxTcpWindowSize、TcpWindowSize。我假设我应该尝试将发送缓冲区设置为 0,将接收缓冲区设置为较大的值,这是正确的策略吗?
我拥有最快的 CPU,我禁用了网卡的中断调节,我还能做什么来最大限度地减少延迟?即使 100 微秒对我来说也很重要。
答案1
以下是 Microsoft 针对 Windows Server 2008 R2 的性能调优指南文档:
该文档中有 136 页的性能调优指南。
您可能还会从 support.microsoft.com/kb/214397/en-us 获取一些有趣的信息
您也可以尝试禁用 Windows 过滤平台,这通常不推荐,但它可能有助于缩短 I/O 在操作系统中的旅程。
微软还在 Windows 中嵌入了大量专门针对低延迟网络的技术,尽管其中大多数是 2012 年的特定改进,而不是 2008 R2 的改进:
http://technet.microsoft.com/en-us/library/hh831415.aspx
数据中心桥接
数据中心传输控制协议 (DCTCP)
内核模式远程直接内存访问 (kRDMA)
网络接口卡 (NIC) 组合
网络直连
接收段合并 (RSC)
接收方缩放 (RSS)
注册输入/输出 (RIO) API 扩展
传输控制协议 (TCP) 环回优化
低延迟工作负载管理和运营
但软件调整能做的事情非常有限。只需将硬件升级到融合以太网上的 Infiniband/RDMA,您将获得大幅减少的延迟,这是通过翻转 Windows 注册表中的位永远无法实现的。
最后,这里有一些更直接的东西回答关于延迟 ACK 的问题。我不知道这是否真的是你的问题,但是:
子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
条目:TcpAckFrequency
值类型:REG_DWORD,数字 有效范围:0-255 默认值:2
描述:指定在延迟 ACK 计时器被忽略之前未完成的 ACK 数量。Microsoft 不建议在未仔细研究环境的情况下更改默认值。如果将该值设置为 1,则每个数据包都会立即得到确认,因为只有一个未完成的 TCP ACK,因为刚刚收到一个段。值 0(零)无效,并被视为默认值 2。只有在未收到段且主机不打算确认数据时,ACK 编号才为 0。
答案2
首先禁用大型发送卸载,网络堆栈等待发送数据包以填充缓冲区,关闭该选项后它会发送更多小数据包,但有助于提高速度。