我设置了一个 Web 服务器,用于为多个域提供基于 vhost 的 Web 托管,并且已经运行了一段时间。该服务器运行的是带有 Apache 的 Ubuntu。PHP 作为 FastCGI 而不是 Apache 模块运行。
从周日早上开始,apache2 进程偶尔会达到 100% 的 CPU 利用率,并且一直停留在那里,直到重置后才不再处理任何请求。只需重新启动 apache 即可解决该问题。
所有站点都设置为使用 FastCGI 作为 PHP 解释器,因此我怀疑问题的最明显来源(糟糕的 PHP 脚本)应该导致 php5-cgi 限制 CPU,而不是 apache2,对吗?
有什么办法可以以某种方式询问 apache2 进程,看看它此时正在做什么?
简单的网络日志调查没有发现任何可疑活动或激增的请求泛滥。
有点困惑——目前只是运行一个监控脚本,检查是否存在猖獗的 apache2 进程,如果发现则重新启动它。
更新:
今天早上,进程再次达到 100%,并快速strace -f -p [pid]
产生了以下输出。这 6 行重复的速度与屏幕滚动的速度一样快。
wait4(3437, 0x7fffaf867184, WNOHANG|WSTOPPED, NULL) = 0
wait4(5497, 0x7fffaf867184, WNOHANG|WSTOPPED, NULL) = 0
wait4(5504, 0x7fffaf867184, WNOHANG|WSTOPPED, NULL) = 0
wait4(3436, 0x7fffaf867184, WNOHANG|WSTOPPED, NULL) = 0
wait4(4035, 0x7fffaf867184, WNOHANG|WSTOPPED, NULL) = 0
wait4(3437, 0x7fffaf867184, WNOHANG|WSTOPPED, NULL) = 0
答案1
您可以尝试使用以下命令附加到恶意进程strace
:
strace -f -p [PID]
这将向您显示进程正在进行哪些系统调用(如果有)。请注意,进程可能不会在系统调用中浪费 CPU 时间,而是执行实际的进程内工作,但如果进程进入了涉及某个系统调用的循环,这将为您提供有价值的信息。