有一个问题与我想了解的有关服务器故障的问题类似:我如何才能准确找到哪些 PHP 脚本占用了所有服务器资源?但我认为没有任何答案能够回答我的问题。
今天,我的一位客户给我发了一张截图。他不知道这是什么意思,所以他把它发给我,让我向他解释。这张图片是由他的托管服务提供商发送的。我客户的网站运行缓慢,我猜他问了托管人员原因,所以他们给他发了那张图片。这张图片似乎是 top 命令的截图,它显示一个文件占用了 90% 以上的 CPU。我觉得这真的很有趣,我很想知道如何自己做到这一点。
正如我所说,屏幕截图似乎是 top 命令,但是当我运行 top 并使服务器繁忙时,我得不到相同的结果。我确保我运行的脚本通过无限循环占用了一些 CPU,但我得到的只是 apache2 作为占用 CPU 的命令,而他们的屏幕截图显示:
/usr/bin/php /path/to/index.php
屏幕截图如下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 username 16 -2 134m 26m 7528 R 98 0.2 00:00:50 /usr/bin/php /path/to/file.php
我的看起来像这样:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19632 www-data 20 0 44432 18m 3608 S 27.1 0.9 00:00:82 apache2
注意他们的显示 /usr/bin/php 和占用 CPU 的文件路径,但我的只显示 apache2,这实际上没有告诉我任何有用的信息。
我一直想做这种事,找出哪个文件占用了 CPU,现在,我的问题是,他们如何使用 top 做到这一点?我知道我可以使用分析器,事实上,上面我喜欢的问题有两个不错的建议,但我很好奇他们如何使用 top 做到这一点。
提前致谢。
答案1
您的两个系统之间的区别显然在于,在客户端系统上,PHP 作为 CGI 可执行文件运行(这是托管服务提供商的常见选项),而在您的系统上,它作为 Apache 模块运行。CGI 意味着每当需要执行 PHP 脚本时都会启动一个单独的程序,该程序列在顶部输出中。另一方面,将其作为 Apache 模块运行意味着 PHP 解释器只是 Apache 的一个子程序,没有自己的进程,因此无法列在顶部。
为了找到与 CGI 案例中的 top 类似的信息,你可以尝试使用ApacheTop。