我遇到了一个奇怪的问题,我不知道如何进一步分析 - 有一个相当轻量级的网站运行在一个相当好的机器上(Xeon,4Gb ram,SATA)。根据访问日志判断,它每秒收到大约 120 个请求。
一个盒子上的负载平均值几乎随机地在 5 和 20 之间跳跃,但很少低于 10。CPU 利用率约为平均 70%,并且相当稳定。有很多 Apache 进程,它们似乎都在某个点上锁定了某些东西,这导致负载平均值跳到 15 以上,我不太明白如何找出它们锁定了什么。
我可以用什么来查看 apache 进程内部发生的情况以及它在哪里阻塞?
答案1
strace 其中一个正在运行的进程可以帮助
netstat -n |grep :80|cut -c 45-|cut -f 1 -d ':'|sort|uniq -c|sort -nr|more
(可能需要根据 Linux 版本调整 45-)
也许:
tail -n 10000 access.log|cut -f 1 -d ' '|sort|uniq -c|sort -nr|more
您有任何繁忙的 IP 吗?
如果 CPU 占用率为 70%,则意味着这是计算负载,而不是文件锁定。我怀疑 php 脚本正在执行大量计算以显示页面。如果您看到服务器的 IP 出现在这两个列表中的较高位置,则可能是递归包含。或者,如果您有 include('http://localserver.com/file.php'); 有时这会增加负载,因为 php 必须通过套接字包含该文件。
您是否接近 MaxClients 值?apache 错误日志中有什么内容?
答案2
从 top 中查看时,是否有任何 apache 进程似乎占用了大量 CPU?如果是这样,请尝试 strace 其中一个进程以查看它在做什么。它会提供相当多的噪音,但是,您可能能够看到一个模式。您可以使用脚本 strace -p processid 来观察它,然后在最后使用 control-d 并获得一个名为 typescript 的文件,该文件也包含所有信息。
我怀疑你有一个 php 应用程序,它可能会消耗大量的 CPU,要么进行大量计算,要么只是在目录中遍历包含数万个文件的文件。你也可能有一个 mod_rewrite 正在执行大量重定向。基于 CPU 负载相当恒定的事实,这可能是锁定文件的原因,但看起来更像是你进行了递归提取或基于某人访问页面而触发的某些操作。
答案3
根据 op 的评论,您应该调低保持活动超时时间,通常它们在默认配置下相当高。
此外,如果每秒有那么多的连接并且保持活动超时很高,那么您将面临文件描述符耗尽的风险,这可能会导致 io 等待。