Leo*_*eon 16 timeout apache-2.2
我使用prefork. Apache 每天收到大约 100k-200k 的请求,其中大约 100-200 个达到超时限制(所以大约千分之一),几乎所有其他请求都远低于超时。
我该怎么做才能找出发生这种情况的原因?或者所有请求的一些小部分超时是否正常?
这是我到目前为止所做的:

可以看出,在超时限制和更合理的请求之间的请求很少。目前超时限制设置为 50 秒,之前设置为 300 并且情况仍然相同,有一些超时,然后与其他请求存在巨大差距。
所有超时的AJAX请求都是请求,但绝大多数都是请求,所以这可能更多是巧合。Apache 返回码为200,但显然已达到超时限制。它们来自各种不同的 IP。
我查看了超时的请求,它们没有什么特别之处,如果我执行相同的请求,它们会在不到一秒钟的时间内完成。
我试图查看不同的资源,看看我是否能找到原因,但没有运气。总是有足够的空闲内存(最低大约 3GB 空闲),负载有时高达 1.4,CPU 利用率高达 40%,但许多超时发生在负载和 CPU 利用率低时。磁盘写入/读取在白天几乎保持不变。MySQL 慢查询日志中没有条目(设置为记录 1 秒以上的任何内容),无请求使用那么多数据库写入/读取。

蓝色是 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>
Run Code Online (Sandbox Code Playgroud)
我更新到 Ubuntu 12.04.1,以防万一,没有变化。我添加了 mod_reqtimeout 设置:
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500
Run Code Online (Sandbox Code Playgroud)
现在几乎所有超时发生在 10 秒,一两次发生在 20 秒。我认为这意味着大多数时候它正在获取有问题的请求正文?请求正文不应大于几百字节。我每 1 秒监控一次网络流量,它从未超过 1Mbit/s 并且我没有看到任何 rxerrs 或 rxdorps,考虑到服务器位于 1Gbit/s 线路上,这听起来不像HopelessN00b 贴一下。这可能只是一些不良用户连接的情况吗?
对于每小时的峰值(它们似乎有点漂移,在上图中,它们是一小时过去 33 分钟,现在是一小时过去 12 分钟),我试图查看是否有任何定期运行( crons 等),但一无所获。PHP 垃圾收集每小时运行两次,但不是在峰值时,我仍然尝试禁用它,但没有任何区别。
我已经将 dstat 与 --top-cpu 和 top 一起使用来查看峰值时的进程,所有显示的是 apache 努力工作了几秒钟,但没有其他进程正在使用重要的 cpu。
我做了一个放大的尖峰图:

对我来说,看起来 apache 停止了几秒钟,然后努力处理在停止期间传入的请求。什么可能导致这种停止,或者我误解了它?
我注意到的第一件事,看你的第一张图,似乎每小时减速(发生在一个小时后大约 40 分钟),这可能是导致问题的原因。您应该查看操作系统/数据库上的任务调度程序。
根据您提供的数据,我的下一步将是查看响应时间的频率(Y 轴上的响应数与 X 上的持续时间),但只包括显示超时的 URL(或者最好一次一个 URL )。在典型的系统上,这应该遵循正态分布或泊松分布 - 超时的请求可能只是尾部的一部分 - 在这种情况下,您需要将精力集中在一般调整上。OTOH 如果分布是双模态的,那么您需要在代码中的某处寻找争用。
| 归档时间: |
|
| 查看次数: |
32433 次 |
| 最近记录: |