我发现下面的问题非常有趣,我想你也会发现的。
我有一台 Linux 服务器,用于托管一些网站。它使用 CENTOS 6 和 DIRECTADMIN。这些网站的流量不错,它很繁忙,但我从未遇到过不稳定问题。
最近几天发生了一些奇怪的事情。
每小时几分钟,每次 (26-30) 服务器都无法通过 Web 访问。负载不断增加,并且会打开许多 httpd (apache) 进程。
我对 mod_status 输出进行了非常彻底的分析,没有发现任何异常(我将具有开放连接的 ips 分组)。看来那些是我的正常流量,但由于某种原因被延迟了。
top 并没有给我带来任何异常,只是负载大大增加,但是没有任何进程突出。
很多(打开了 900 个 httpd 进程),但我没有发现任何发出大量请求的恶意 ip。我最好的猜测是某些东西使系统过载,导致 http 查询延迟。
我停止了 crond 并等待下一个循环,但发生了同样的情况。
我还使用 netstats 监控了端口 80,将具有开放连接的 IP 分组。没什么异常。nginx 在端口 80 上运行,httpd 在端口 8000 上运行,我检查了这两个端口,8000 只与我的 IP 建立连接,而端口 80 没有任何 IP 突出。
/var/log/messages 没有任何内容,apache 错误日志也没有任何内容。
没有运行 cron,我每小时都会遇到相同的过载问题,就像时钟一样。几分钟后,风暴就过去了。
有人知道如何查明问题吗?还有其他导致 CPU 消耗但未显示的原因吗?
答案1
我会查看这些 Apache 进程连接到的外部服务。也许您当时安排了每小时一次的数据库备份,也许这会锁定所有表。
总的来说,这听起来不像是 Apache 服务器本身的问题。
答案2
如果时间安排如此紧密,除了交叉引用该时间段内的所有日志之外,您还可以考虑将 strace 附加到 httpd PID 以进行更深入的查看,或者在通常发生之前在前台以调试模式运行 apache。
HTTPd 有 -X 选项,虽然性能显然会受到影响,所以我会尝试尽可能接近事件。
“-X 在调试模式下运行 httpd。将仅启动一个工作程序,并且服务器不会与控制台分离。”
对于 strace,你可以尝试
strace -f -p $HTTPd_PID
和/或
strace -f -c -p $HTTPd_PID
-f 跟踪 fork,-c 统计系统调用数。