我的 apache2 运行缓慢。单个 PHP 文件需要很长时间才能处理。服务器处于活动状态。我不想重新启动它。所以我想我连接strace
到它并检查发生了什么。
所以我跑
strace -p `cat /var/run/apache2.pid `
之后我加载了一些测试网址。加载了很多次。但我没有在控制台上看到任何输出strace
!
然后我记得有很多子进程。所以我检查了一下它们
$ ps ax | grep apache[2] -i
1877 ? Ss 0:02 /usr/sbin/apache2 -k start
2006 ? S 0:00 /usr/sbin/apache2 -k start
2007 ? S 0:00 /usr/sbin/apache2 -k start
2008 ? S 0:00 /usr/sbin/apache2 -k start
2009 ? S 0:00 /usr/sbin/apache2 -k start
2010 ? S 0:00 /usr/sbin/apache2 -k start
9985 ? S 0:00 /usr/sbin/apache2 -k start
9988 ? S 0:00 /usr/sbin/apache2 -k start
9997 ? S 0:00 /usr/sbin/apache2 -k start
9998 ? S 0:00 /usr/sbin/apache2 -k start
9999 ? S 0:00 /usr/sbin/apache2 -k start
现在我的问题是如何跟踪所有这些子进程?我如何知道哪个子进程正在处理请求?
答案1
简短的回答:您无法预测哪个 Apache 进程将处理请求。
解决这个问题最简单的方法是给每个 apache 进程指定一个 xterm,并strace -p <pid>
为每个 apache pid 在其中运行。
当我处于这种情况时,我通常会在我的httpd.conf
开发箱中执行以下操作:
<IfModule prefork.c>
StartServers 1 <--------
MinSpareServers 1 <--------
#StartServers 8
#MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
这减少了我需要监控的进程数量......显然对于生产环境来说这不是一个好的解决方案。
仅供参考,如果您需要strace
一个在启动后分叉的进程stracing
(例如,一个wsgi
过程),您可以使用strace -fp <pid_of_future_forker>
它,它将strace
自动分叉子进程。