【发布时间】:2012-07-27 12:20:20
【问题描述】:
我有一个 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 选项吗?
屏幕截图第二列是数据包之间经过的时间。
【问题讨论】:
-
我删除了关于 HTTP keep-alive 的答案,因为它已被明确排除。虽然想不出其他答案。一旦套接字关闭,FIN 应该会熄灭。
-
@AlanCurry 但是 FIN/ACK 只有在客户端读取传入的 FIN 并决定关闭套接字时才会消失,这可能需要任何时间。这是 node.js 的行为,而不是 TCP/IP 堆栈。
-
当然可以,但是如果它在调用 http 客户端库的过程中,它不会保持活动状态,并且 CPU 负载是 1%,那么在关闭套接字之后需要这么长时间阅读EOF?
-
同时连接多少?您生成的总连接数是多少?请求的对象有多大?客户端和服务器之间的网络延迟是多少?你的 POST 对象有多大?其中有多少是同时发生的?当连接出现错误时,您是否在客户端中实施任何类型的退避?
-
@Tereska:您可能已经烧毁了所有临时端口,并且正在等待其中一些端口的 2xMSL 超时完成,然后才能创建新连接。你检查过 netstat 吗?
标签: linux node.js networking tcp tcpdump