我有一个node.js客户端(10.177.62.7)从服务器(10.177.0.1)的http rest服务请求一些数据。客户端只是使用node.js http.request()方法(agent = false)。客户端在Ubuntu 11.10框上。
为什么客户端在475ms后发送FIN ACK?为何这么慢?他应该立即发送FIN ACK。我有很多这样的情况。大约1%的整个流量是带有延迟FIN ACK的请求。
客户端上的Cpu空闲大约是99%,所以没有任何东西在耗尽CPU。
如何调试?会是什么呢? 我需要调整任何sysctl选项吗?
屏幕截图第2列是数据包之间经过的时间。
答案 0 :(得分:4)
此行为是RFC1122 TCP stack的延迟确认功能。
通常您应该将TCP_QUICKACK
选项添加到Linux TCP socket到disable delayed ACK,但我认为使用JavaScript Node.js API并不明显(我只看到了socket.setNoDelay
TCP_NODELAY
选项)。
所以你应用system-wide change on TCP stack的想法似乎很好,但我发现没有sysctl
匹配此套接字选项行为。这是另一个full list with explanation。