查看top的输出,我注意到,间歇性地有一个或两个Apache进程消耗大量的CPU – 任何50%到90%
CPU使用率的峰值每隔10秒左右就会相当快。
还有其他各种Apache进程正在运行,消耗了2%-4%
我研究了所有尝试追踪哪个虚拟主机/网站负责这些过程的各种方法。 但是,因为他们来得及迅速,我找不到一个可靠的方法来做到这一点。
我试过了lsof ,同时也查看了server-status的输出,但是由于进程持续时间不长,进程ID被重新使用,并且不可能将其绑定到造成问题的虚拟主机。
例如,如果我在有问题的进程ID上运行lsof ,它会列出十几个不同的虚拟主机日志文件,它们在最后几秒内共享该进程ID。 我确信有一个虚拟主机有问题,但我不知道哪一个虚拟主机。
我也检查了MySQL慢查询日志,这并没有显示任何有趣的东西。
我的build议:添加响应时间到您的日志。
这并不是完美的,因为不能保证造成秒杀的请求比别人花费更长的时间,但这很可能,并且给你一个调查的起点。
为此,您需要定义一个包含%D参数的新LogFormat和CustomLog。 请参阅Apache mod_log_config文档 。
另一个可能稍微低一点的选项,可以给你一个关于负载性质的概念,那就是将apache的父进程用-f跟踪subprocess,用-c来显示每个调用的cpu时间,例如strace -f -c -p <apache parent pid>
一旦知道花费最多时间的系统调用,就可以直接跟踪它们。 例如,假设服务器花了很多时间写write(),那么可以执行strace -f -e trace=write -p <apache parent pid> ,然后更详细地查看这些调用。