Мой apache2 работает медленно. Обработка одного файла PHP занимает много времени. Сервер жив. Я не хочу его перезапускать. Я подумал, что прикрепляю strace
к нему и проверьте, что происходит.
Так что я бегу
strace -p `cat /var/run/apache2.pid `
После этого я загружаю несколько тестовых URL. Загрузите потом много раз. Но я не видел вывода на 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
Теперь у меня вопрос: как связать все эти дочерние процессы? Как узнать, какой дочерний процесс обрабатывает запрос прямо сейчас?
Короткий ответ: вы не можете предсказать, какой процесс apache обработает запрос.
Самый простой способ решить эту проблему - выделить xterm для каждого процесса apache и запустить strace -p <pid>
в нем для каждого pid apache.
Когда я в такой ситуации, я обычно делаю это в своем 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
раздвоенные дети автоматически.