我们正在使用 ServiceStack 3.9.71.0,我们目前在通过 WAN 连接的客户端遇到无法解释的延迟问题。
200ms+ 后收到带有非常小的有效负载(<100 字节)的回复。
由于地理距离,链路上的往返时间 (RTT) 约为 40 毫秒。这已通过 ping 另一台主机并使用简单的回显服务来测试 TCP 连接的延迟来验证。
ping 和 echo 测试均显示符合预期的延迟。从我们的 ServiceStack 主机获得回复的时间比预期的要长得多。
我们已经验证:
- WAN 链接仅以 25% 的容量运行(无拥塞)
- WAN 链路上没有使用 QOS
- 同一主机快速回复来自本地网络上不同主机的相同请求
- 延迟不是由我们的代码处理请求引起的
我们现在偶然发现了 Nagle 的算法,它可能意味着 WAN 网络上的小请求的延迟 ( http://blogs.msdn.com/b/windowsazurestorage/archive/2010/06/25/nagle-s-algorithm-is -not-friendly-towards-small-requests.aspx)。
在 .NET 中,可以通过设置TcpClient.NoDelay = true
(https://msdn.microsoft.com/en-us/en-US/library/system.net.sockets.tcpclient.nodelay(v=vs.110).aspx)禁用它。
如何禁用 ServiceStack 的 TCP 处理?
编辑:我不认为这是HttpWebRequest is slow with chunked data的副本。提到的问题涵盖HttpWebRequest
了 ServiceStack 不使用的问题。ServiceStack 使用HttpListener
也恰好由上述ServicePointManager
. 我们将进行测试,看看设置是否能ServicePointManager.UseNagleAlgorithm = false
解决问题。