如何debuggingApache的超时?

我使用prefork在Apache 2.2服务器(Ubuntu Server 10.04,8x2GHz,12Gb RAM)上运行PHP Web应用程序。 Apache每天获得大约100k-200k的请求,其中大约100-200个点击超时限制(大约每1000个点击一次),几乎所有其他的请求都在超时时间之外服务。

我能做些什么来找出为什么发生这种情况? 或者所有请求中的一小部分超时是否正常?

这是我迄今为止所做的:

请求响应时间

可以看出,在超时限制和更合理的请求之间的请求很less。 目前超时限制被设置为50秒,之前被设置为300,并且在一些超时之后仍然是相同的情况,然后与其他请求相距甚远。

所有超时的请求都是AJAX请求,但其中绝大多数都是,所以也许更是巧合。 Apache的返回码是200 ,但超时限制显然已经达到了。 他们来自各种不同的知识产权。

我已经看过了那些超时的要求,如果我做了相同的要求,他们的要求也不会超过一秒钟。

我试图看看不同的资源,看看我能find原因,但没有运气。 总是有足够的可用内存(最less约3GB空闲),负载有时高达1.4,CPU利用率达到40%,但是当负载和CPU利用率很低时,很多超时会发生。 磁盘写入/读取在一天中几乎是不变的。 MySQL慢速查询日志中没有条目(设置为logging大于1秒的任何内容),没有请求使用这么多的数据库写入/读取。

请求系统加载/ CPU的响应时间

蓝色是CPU使用率,最高峰值为40%,栗色负载峰值为1.4。 所以我们可以看到,即使在CPU利用率/负载较低的情况下,我们也会得到超时(十秒钟的峰值与CPU利用率相当,但这是另一个问题,我有更高的期望找出可能造成这种情况的原因)。

Apache错误日志中没有错误,我没有看到它达到200多个活动的Apache进程。

服务器设置:

 Timeout 50 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 2 <IfModule mpm_prefork_module> ServerLimit 350 StartServers 20 MinSpareServers 75 MaxSpareServers 150 MaxClients 320 MaxRequestsPerChild 5000 </IfModule> 

更新:

我更新到Ubuntu 12.04.1,以防万一,没有改变。 我添加了mod_reqtimeout的设置:

 RequestReadTimeout header=20-40,minrate=500 RequestReadTimeout body=10,minrate=500 

现在几乎所有的超时发生在10秒钟,20秒钟一两次。 我认为这意味着大多数情况下,获取请求主体是有问题的。 请求体不应该大于几百字节。 我已经每秒监测一次networkingstream量,并且从未高于1Mbit / s,而且我没有看到任何rxerrs或rxdorps,考虑到服务器位于1Gbit / s的线路上,听起来不像HopelessN00b发布了。 难道这只是一些不好的用户连接?

对于每小时的尖峰(他们似乎有一点点漂移,在上面的图表中,他们是在过去的一小时33分钟,现在他们在12分钟过去了),我试着看看是否有任何周期性的运行克伦等),但没有发现。 PHP的垃圾收集每小时运行两次,但不是在尖峰时刻,我仍然尝试禁用它,但没有任何区别。

我用dstat –top-cpu和top来查看尖峰时的进程,所有显示的都是apache努力工作了几秒钟,但没有其他进程正在使用重要的cpu​​。

我已经放大了峰值的图表: 缩放请求响应时间

对我来说,看起来像apache暂停几秒钟,然后努力工作来处理暂停期间的请求。 什么可能导致这样的停顿,还是我误解了?

我注意到的第一件事,看你的第一张图,似乎有一个小时的减速(发生在每小时40分钟左右),这可能是造成这个问题的原因。 您应该查看OS /数据库上的任务调度程序。

根据您提供的数据,我的下一步将是查看响应时间的频率(Y轴上的响应数量与X上的持续时间数量),但只包括显示超时的URL(或者最好是一个URL )。 在典型的系统中,这应该遵循正态分布或泊松分布 – 超时的请求可能只是尾部的一部分 – 在这种情况下,您需要将精力集中在常规调整上。 OTOH如果分布是双模态的,那么你需要在你的代码中寻找争用的地方。

我还有一个想法,基于你每天收到大量的请求,并且似乎只在高峰时间(从你张贴的图片)中有超时。

在服务器故障博客上有一篇文章, Per Second Measurements Don't Cut It …有可能这些请求中的一部分遇到了与ServerFault团队遇到的相同的问题吗?

我们发现,我们在1 Gbit / s接口上频繁丢弃数据包的速度只有10-30 MBit / s,这会影响我们的性能。 这是因为10-30 MBit / s的速率实际上是每5分钟转换为1秒速率的比特数。 当我们与Wireshark打成一片,并使用了一毫秒的IOgraphics时,我们看到我们会频繁地突发所谓1 Gbit / s接口的每毫秒1 Mbit的速率。