客户端发送延迟FIN ACK(〜500ms)到服务器

我有一个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。

如何debugging呢? 会是什么呢? 有没有我需要调整的sysctl选项?

截屏2列是数据包之间的stream逝时间。

链接到更大的图片。

在这里输入图像说明

Solutions Collecting From Web of "客户端发送延迟FIN ACK(〜500ms)到服务器"

此行为是RFC1122 TCP堆栈的延迟ACK功能。

通常情况下,你应该添加TCP_QUICKACK选项到你的Linux TCP套接字来禁用延迟的ACK,但是我认为JavaScript Node.js API(我只看到了socket.setNoDelay for TCP_NODELAY选项)并不明显。

所以你对TCP栈应用全系统变化的想法看起来不错,但是我发现没有与此套接字选项行为相匹配的sysctl 。 这是另一个完整的清单和解释 。