10

我有一个 node.js 客户端(10.177.62.7)从服务器(10.177.0.1)请求来自 http rest 服务的一些数据。客户端只是使用 node.js http.request() 方法(agent=false)。客户端在 Ubuntu 11.10 盒子上。

为什么客户端在 475 毫秒后发送 FIN ACK?为什么这么慢?他应该立即发送 FIN ACK。我有很多这样的情况。大约 1% 的总流量是带有延迟 FIN ACK 的请求。

客户端上的 CPU 空闲率约为 99%,因此没有什么会耗尽 CPU。

如何调试这个?会是什么呢?我需要调整任何 sysctl 选项吗?

在屏幕截图第二列是数据包之间经过的时间。

链接到更大的图片。

在此处输入图像描述

4

1 回答 1

4

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

通常,您应该将TCP_QUICKACK选项添加到您的Linux TCP 套接字禁用延迟 ACK,但我认为 JavaScript Node.js API 并不明显(我只看到socket.setNoDelayTCP_NODELAY选项)。

因此,您在 TCP 堆栈上应用系统范围更改的想法似乎不错,但我发现没有sysctl匹配此套接字选项行为。这是另一个带有解释的完整列表

于 2012-08-02T13:45:55.667 回答