使用哪个 pid 来 strace 我的 apache

使用哪个 pid 来 strace 我的 apache

我的 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自动分叉子进程。

相关内容