Назад | Перейти на главную страницу

Узнать, что на самом деле делает процесс apache с высокой загрузкой ЦП?

В настоящее время возникает несколько проблем с нашим сервером, из-за которых периодически возникают процессы apache, которые просто запускаются и запускаются, занимая 100% ЦП.

При запуске сверху видим следующее:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20788 www-data  20   0  318m  18m 3984 R  100  0.0  40:29.21 /usr/sbin/apache2 -k start
23523 www-data  20   0  319m  20m 4684 R  100  0.0   4:12.36 /usr/sbin/apache2 -k start

Я хочу попытаться выяснить, какой сценарий (или что-то еще) вызывает это, поэтому я попробовал:

 strace -p 20788

Но это вообще не показывает никакого вывода (я оставил его примерно на 10 минут, и он ничего не показывает). Насколько я понимаю, это может означать, что он застрял в бесконечном цикле, и нет никаких «системных вызовов» для отображения.

Что еще я могу сделать, чтобы показать, что происходит?

Спасибо

Редактировать - Забыл упомянуть, что это живой сервер с несколькими сотнями пользователей одновременно! Поэтому я не могу просто свободно попробовать изменить параметры конфигурации и перезапустить apache.

Изменить 2 - Обратная трассировка (bt) от gdb кажется не очень полезной, когда PHP не настроен с помощью --enable-debug - он показывает только «execute ()», но мне нужно знать, какой скрипт PHP действительно выполняется. . Есть ли другой путь?

#0  0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so
#1  0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so
#2  0x00007f6c1438b970 in zend_execute_scripts () from     /usr/lib/apache2/modules/libphp5.so
#3  0x00007f6c14337fe3 in php_execute_script () from     /usr/lib/apache2/modules/libphp5.so
#4  0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so
#5  0x00007f6c18912508 in ap_run_handler ()
#6  0x00007f6c1891297e in ap_invoke_handler ()
#7  0x00007f6c18922570 in ap_process_request ()
#8  0x00007f6c1891f398 in ?? ()
#9  0x00007f6c18918fa8 in ap_run_process_connection ()
#10 0x00007f6c189271d0 in ?? ()
#11 0x00007f6c1892793a in ?? ()
#12 0x00007f6c189284e7 in ap_mpm_run ()
#13 0x00007f6c188fd4a4 in main ()

Что ж, если ты храбрый:

gdb -p 20788

затем выпустить bt чтобы увидеть стек-фрейм, например, e. грамм.

И, кстати, есть также ltrace чтобы упомянуть - попробуйте тоже.

UPD.: ну да ладно, так как теперь у нас есть идея, что Apache действительно что-то запускает, почему бы тебе не взглянуть на mod_status вывод - Расширенный один?

Очень простой подход - использовать htop. Вы можете отсортировать процессы с высокой загрузкой ЦП, а затем использовать

  • s для strace процесс
  • л для lsof чтобы увидеть открытые файлы процессов
  • L к ltrace.

Я обнаружил, что по крайней мере один из этих параметров находит сценарий, который генерирует нагрузку, и вы, конечно, можете использовать его на рабочем веб-сервере для отладки.

Вы можете попробовать:

  • iotop (показывает ввод-вывод в системе)
  • netstat -t (показывает соединения)
  • Взгляните на файлы журнала apache и выясните, что сервер делал в последний раз
  • установить некоторые RLimits для процесса apache. Когда эти ограничения будут достигнуты, процесс будет остановлен, предоставив вам дополнительную информацию.

PID этого экземпляра apache низкий, он может быть отцом всего множества. Это, безусловно, объясняет высокую загрузку ЦП (он остается, другие создаются и вызываются в зависимости от нагрузки). Большое количество накопленного процессорного времени может означать, что он работал долгое время. Нет вывода из strace(1) просто означает, что он не делал системных вызовов. Да, это может быть замкнутый цикл, но apache - это, по сути, ввод-вывод через сеть, поэтому я бы подумал, что он не делает ничего полезного. Странно 100% одного CPU, в любом случае.

Ваша команда должна работать при условии, что вы сделаете HTTP-запрос, который запускает этот PID.

Может быть, вы хотите временно перенастроить Apache только с одним дочерним процессом?

Попробуй это:

1) Запустите журнал с датой / временем, скриптом PHP и PID, используя getmypid()

2) Затем следите за своим сервером с помощью top

3) Когда вы видите, что процесс apache набирает обороты, найдите те же дату / время и PID в своих журналах. Вы должны найти проблемный сценарий.