我们的静态内容服务器偶尔会遇到奇怪的3秒钟的等待时间。 通常情况下,ApacheBench运行(> 10000请求,并发1或40,没有区别,但保持closures)看起来像这样:
连接时间(ms)
分钟平均值[+/- sd]中值最大值
连接: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与工人或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上 – 开启或closuresshorewall(即空的iptables或没有) – AllowOverride None开启/,所以没有.htaccess检查(用stracevalidation) – 问题依然存在,无论是直接访问networking服务器还是通过网捷networking负载均衡器访问
内核是2.6.32(Debian Lenny backports),但是它也是以2.6.26发生的。 IPv6已启用,但未使用。
这个问题是否对任何人都很熟悉? 帮助/build议非常感谢。 这听起来有点像一个SYN,ACK数据包丢失或被忽略。
用tcpdump / Wireshark / tshark捕获这个事件。 然后在Wireshark中打开捕获,进入Statistics-> TCPstream图 – >时序图(Stevens)。
这给你一个序列号与时间的关系图。 如果你的连接有3秒钟的间隙,你应该能够发现它,因为在两个密集的点之间的x轴上3秒钟内应该没有点。 点击间隙左侧的最后一个点。 这将把你带到差距发生之前的那一帧。 通常这是包含问题的一个数据包。 您可能会看到零窗口数据包,数据包丢失,无序传送,dups等等。
检查您的DNS服务器是否缓慢,并设置您的Apache日志文件,以便他们通过IPlogin,而不是域名。 如果您不更改默认日志文件设置,则每当您收到请求时,logging器都必须执行DNS查找。
这可能是由许多有趣的IO锁造成的。 首先,尝试隔离问题。 问题是服务器/networking,还是服务? 你可以用ping / tcpping来复制这个问题吗?
如果这是整个服务器挂起几秒钟的问题。
您的硬盘是否设置为不活动? 如果您在转速较低的HD上发生页面错误,系统可能需要几秒钟才能恢复。 无论哪种方式,考虑摆脱交换。
这可能是networking的低级别问题。 当交换机用尽MAC地址表中的空间时,我看到类似的行为与罕见,缓慢的连接。 做一些数据包跟踪,看看是否可以看到networking上似乎相关的其他东西。
它也可能是服务器的硬件问题,例如总线在几秒钟后locking和恢复。 检查你的日志。
如果似乎只是阿帕奇:
DNS查找将是一个常见的罪魁祸首,但你似乎有一个覆盖。
尝试推出一个完全不同的服务器(如lighttp),看看是否让你围绕这个问题。 然后你可以开始怀疑你的apacheconfiguration中的东西。
听起来像TCP连接build立的问题,即丢失的SYN,ACK,就像你所build议的一样。
3秒是Linux上TCP SYN,ACK的默认第一个超时。 由于内核处理连接build立,所以不太可能是应用程序(web服务器)相关的。
由于它影响不到1%的连接,有些事情可能是:
我最近在服务器上有这个,结果是上面第二个:configuration错误的网卡,它被强制为错误的速度和双工设置。 我重置它与ethtool自动协商,并没有回头看。