奇怪的 3 秒 TCP 连接延迟(Linux,HTTP)

奇怪的 3 秒 TCP 连接延迟(Linux,HTTP)

我们的静态内容 Web 服务器偶尔会出现奇怪的 3 秒延迟。通常,ApacheBench 运行(> 10000 个请求,并发数 1 或 40,没有差异,但 keepalive 关闭)如下所示:

连接时间(毫秒)
              最小平均值[+/-标准差] 中位数 最大值
连接:2 10 152.8 3 3015
处理:2 8 34.7 3 663
等候:2 8 34.7 3 663
总计:4 19 157.2 6 3222

一定时间内服务的请求百分比(毫秒)
  50% 6
  66% 7
  75% 7
  80% 7
  90% 9
  95% 11
  98% 223
  99% 225
 100% 3222(最长请求)

我尝试了很多方法: - Apache2 2.2.9 带有 worker 或 prefork MPM,没有区别(KeepAliveTimeout 10-15) - Nginx 0.6.32 - 各种 tcp 参数(net.core.somaxconn=3000、net.ipv4.tcp_sack=0、net.ipv4.tcp_dsack=0) - 将文件/DocumentRoot 放在 tmpfs 上 - 开启或关闭 shorewall(即是否清空 iptables) - AllowOverride None 为 / 开启,因此没有 .htaccess 检查(使用 strace 验证) - 无论是直接访问 Web 服务器还是通过 Foundry 负载均衡器访问,问题仍然存在

内核是 2.6.32(Debian Lenny 反向移植),但 2.6.26 也出现了这种情况。IPv6 已启用,但未使用。

这个问题对任何人来说都是熟悉的吗?非常感谢您的帮助/建议。这听起来有点像 SYN、ACK 数据包丢失或被忽略。

答案1

使用 tcpdump/Wireshark/tshark 捕获此事件。然后在 Wireshark 中打开捕获,转到统计信息->TCP 流图->时间序列图 (Stevens)。

这将为您提供序列号与时间的图表。如果您的连接中有 3 秒的间隙,您应该能够发现它,因为在 x 轴上两个密集的点组之间 3 秒内应该没有点。单击间隙左侧的最后一个点。这将带您到间隙发生之前的帧。通常这是包含问题的一个数据包。您可能会看到零窗口数据包、数据包丢失、无序交付、重复等...

答案2

检查您的 DNS 服务器是否很慢,并设置您的 Apache 日志文件,使其按 IP 而不是域名进行记录。如果您不更改默认日志文件设置,则每次收到请求时,记录器都必须进行 DNS 查找。

答案3

IO 锁可能会以多种有趣的方式导致此问题。首先,尝试隔离问题。问题是服务器/网络,还是服务?您能用 ping/tcpping 复制此问题吗?

如果是整个服务器挂起几秒钟的问题。

  1. 您的硬盘是否设置为在不活动时停止旋转?如果停止旋转的硬盘发生页面错误,系统可能需要几秒钟才能恢复。无论哪种方式,请考虑摆脱交换。

  2. 这可能是网络的一个低级问题。当交换机的 MAC 地址表空间不足时,我曾见过类似的行为,连接速度很慢。进行一些数据包跟踪,看看网络上是否还有其他相关的东西。

  3. 也可能是服务器的硬件问题,例如总线锁定并在几秒钟后恢复。检查您的日志。

如果似乎只有 Apache:

  1. DNS 查找是一个常见的罪魁祸首,但你似乎已经解决了这个问题。

  2. 尝试推出一个完全不同的服务器(如 lighttp),看看是否能解决问题。然后你就可以开始怀疑你的 apache 配置中存在问题了。

答案4

听起来就像是 TCP 连接建立存在问题,即丢失了 SYN、ACK,正如您所说。

Linux 上 TCP SYN、ACK 的默认首次超时时间为 3 秒。由于连接建立由内核处理,因此不太可能与应用程序(Web 服务器)相关。

由于它影响不到 1% 的连接,因此可能存在以下情况:

  • 如果在 WAN 上,则会出现数据包丢失(在某些 WAN 类型上,1% 的数据包丢失并不罕见),
  • NIC 配置错误(使用 ethtool 调查并确认双工、自动调谐等),
  • 电缆故障(尝试更换电缆不会有什么坏处),
  • 一个内核错误(您似乎已经消除了它)。

我最近在服务器上遇到了这个问题,结果发现是上述第二个问题:网卡配置错误,被强制设置为错误的速度和双工设置。我将其重置为使用 ethtool 自动协商,之后就再也没有回头了。

相关内容