我有一个node. js客户端(10.177.62.7)从服务器(10.177.0.1)请求超文本传输协议rest服务的一些数据。客户端只是使用node.js http.request()方法(agent=false)。客户端在Ubuntu 11.10盒子上。
为什么客户端在475ms后发送FIN确认字符?为什么这么慢?他应该立即发送FIN确认字符。我有很多这样的情况。大约1%的整个流量是延迟FIN确认字符的请求。
客户端上的cpu空闲率约为99%,因此没有任何东西耗尽CPU。
如何调试这个?可能是什么?我需要调整任何sysctl选项吗?
屏幕截图第二列是数据包之间经过的时间。
链接到更大的图片。
此行为是RFC1122TCP堆栈的延迟确认字符功能。
通常你应该添加TCP_QUICKACK
选项到LinuxTCP套接字禁用延迟确认字符,但我认为这是不明显的JavaScript Node. jsAPI(我只看到socket.setNoDelay
为TCP_NODELAY
选项)。
所以你在堆栈上应用系统范围TCP更改的想法似乎很好,但是我没有发现与这个套接字选项行为匹配的sysctl
。这是另一个完整的列表和解释。