我的apache2正在使用缓慢运行。 一个PHP文件需要很长的时间来处理。 服务器是活的。 我不想重新启动它。 所以我认为我strace它并检查发生了什么。
所以我跑了
strace -p `cat /var/run/apache2.pid `
之后,我加载了一些testingurl。 加载多次。 但是我没有在strace控制台上看到任何输出!
然后我记得有很多subprocess。 所以我检查了他们
$ 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
现在我的问题是我如何处理所有这些subprocess? 我如何知道哪个subprocess正在处理请求?
简短的回答:你不能预测哪个Apache进程将处理请求。
解决这个问题最简单的方法是将xterm专用于每个apache进程,并为其中的每个apache pid运行strace -p <pid> 。
当我处于这种情况时,我通常在我的httpd.conf (在开发框中)执行此操作:
<IfModule prefork.c> StartServers 1 <-------- MinSpareServers 1 <-------- #StartServers 8 #MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule>
这减less了我需要监视的进程的数量…显然这不是一个生产环境的好scheme。
仅供参考,如果您需要对开始stracing后分叉的进程进行stracing (例如, wsgi进程),则可以使用strace -fp <pid_of_future_forker> ,它将自动分叉分叉的subprocess。