好吧,我不想成为无助的 Apache 菜鸟,但我在这里感觉很困惑。
昨晚,我们的 WordPress 网站突然瘫痪了。我重启了它,观察了几分钟,似乎一切正常,所以我就没管它了。然后我醒来发现它又瘫痪了。经过一番调查,我发现,尽管当时每分钟只收到 20 个左右的请求,但 Apache 会为几乎每个请求不断分叉一个新实例,直到达到 MaxClients,然后实例就一直呆在那里什么也不做。此时整个系统的 CPU 利用率实际上只有 0.1%。如果我登录 MySQL 并查看进程列表,我可以看到每个 httpd 都有相应的数据库连接,因此看起来脚本永无止境。但如果我在达到 MaxClients 之前请求静态文件或甚至简单的“Hello world”PHP 文件,该请求将顺利通过。
我真的不知道该看什么,因为这里没有其他人具备通过 SSH 进入盒子甚至安装插件的技术水平,而且我知道我至少几天没有碰过它了——所以我甚至不知道发生了什么变化导致了这个问题。
设置是 Apache 2.2.3/prefork 和 mod_php 5.2.6。以下是明显相关的设置(如果您还想知道其他信息,请告诉我):
httpd配置文件
Timeout 20
KeepAlive Off
<IfModule prefork.c>
StartServers 2
MinSpareServers 1
MaxSpareServers 3
MaxClients 50
MaxRequestsPerChild 2000
</IfModule>
php.ini
max_execution_time = 600 ; Set so high for large file uploads
max_input_time = 600 ; Set so high for large file uploads
memory_limit = 128M ; Set so high for large file uploads
log_errors = On
我尝试过以下方法:
- 提高 MaxClients
- 这只会导致 Apache 占用全部 1.6 GB 的 RAM,然后执行与之前相同的操作
- 将 max_execution_time 和 max_input_time 缩短至 15,将 memory_limit 缩短至 32M
- 没什么区别 — httpd 实例仍然不朽
- 重新安装 WordPress
- 毫无区别
tail -f
错误日志- 除了达到 MaxClients 之外,没有报告任何错误
tail -f
查看 access_log 看看我们是否遭受了 DDOS 攻击- 发生这种情况时,流量确实很低
我感觉我肯定错过了眼前的某些东西,但我无论如何也想不出这里出了什么问题。所以我希望系统管理员方面经验更丰富的人能发现我之前做错了什么。
答案1
Apache 中的 php 脚本突然变得非常慢。您需要找出瓶颈所在。由于 CPU 使用率不高,因此可能是交换、磁盘或网络 IO 速度慢、数据库服务器速度慢、dns 请求速度慢,以及许多其他原因。
首先检查所有日志中是否有可疑错误。如果您仍然不知道 - 您可以尝试 strace apache 进程以查看哪个调用很慢,作为调试的开始。
答案2
好的,抱歉,关于 keepalives 的问题。mysql 服务器上的“show processlist”显示什么?通常,锁定/损坏的表可以解释这个问题。