查看输出时,top
我注意到间歇性地有一两个 Apache 进程消耗大量 CPU——介于 50% 到 90% 之间
CPU 使用率的峰值大约每隔 10 秒就会出现一次,然后很快消失。
还有各种其他 Apache 进程正在运行,消耗 2% - 4% 左右
我研究了各种方法来追踪哪个虚拟主机/网站负责这些进程。但是,由于它们来去匆匆,我找不到可靠的方法来做到这一点。
我已经尝试过lsof
并查看了输出,server-status
但是由于进程持续时间不长,进程 ID 会被重复使用,因此无法将其与导致问题的虚拟主机绑定在一起。
例如,如果我lsof
在有问题的进程 ID 上运行,它会列出过去几秒内共享该进程 ID 的十几个不同的虚拟主机日志文件。我确信有一个虚拟主机有问题,但我不知道是哪一个。
我还检查了 MySQL 慢查询日志,但没有发现任何有趣的内容。
答案1
我的建议:在您的日志中添加响应时间。
它并不完美,因为无法保证导致峰值的请求比其他请求需要更长的时间来处理,但它是可能的,并为您提供了调查的起点。
为此,您需要定义一个包含 %D 参数的新 LogFormat 和 CustomLog。请参阅 Apachemod_log_config 文档。
另一个选项可能有点太低级,但可以让您了解负载的性质,即使用 -f 跟踪 apache 父进程以跟踪子进程,使用 -c 显示每次调用的 CPU 时间,例如strace -f -c -p <apache parent pid>
一旦知道了耗时最多的系统调用,您就可以直接跟踪它们。例如,假设服务器花费大量时间执行 write(),那么您可以执行strace -f -e trace=write -p <apache parent pid>
,并更详细地查看这些调用。