В настоящее время у нас есть несколько проблем с нашим сервером, из-за которых периодически появляются процессы apache, которые просто запускаются и работают, занимая 100% ЦП.
При запуске top мы видим следующее:
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
команду, чтобы увидеть кадр стека, например,И кстати, есть также
ltrace
упомянуть - попробуйте это тоже.UPD. : ну хорошо, так как теперь у нас есть идея, что Apache действительно что-то запускает, почему бы вам не посмотреть на
mod_status
вывод - Extended ?источник
ltrace
тоже не показывал никаких результатов.curl domain.com/server-status > randomfile.html
- затем просмотрел файл. Оказалось, что это был старый код разработчиков, застрявший в цикле (файл PHP)! Все отсортировано сейчас. Спасибо за помощь :)Очень простой подход заключается в использовании
htop
. Вы можете отсортировать процессы с высокой загрузкой процессора, а затем использоватьstrace
процессаlsof
чтобы увидеть открытые файлы процессовltrace
.Я обнаружил, что по крайней мере одна из этих опций находит скрипт, который генерирует нагрузку, и вы, конечно, можете использовать его на рабочем веб-сервере для отладки.
источник
Вы можете попробовать:
источник
Ваша команда должна работать при условии, что вы делаете HTTP-запрос, который запускает этот PID.
Может быть, вы хотите временно перенастроить Apache только с одним дочерним процессом?
источник
PID этого экземпляра Apache низкий, он может быть отцом всего этого. Это, безусловно, объясняет высокую загрузку ЦП (она сохраняется, другие создаются и загружаются в зависимости от нагрузки). Много времени, накопленного процессором, может означать, что оно уже давно работает. Отсутствие вывода
strace(1)
означает, что он не выполнял системные вызовы. Да, это может быть в узком цикле, но apache - это, по сути, ввод-вывод через сеть, поэтому я думаю, что он не делает ничего полезного. Странно 100% одного процессора, в любом случае.источник
Попробуй это:
1) Запустите журнал с датой / временем, PHP-скриптом и PID, используя
getmypid()
2) Затем следите за своим сервером с
top
3) Когда вы видите, что процесс apache идет высоко, ищите ту же дату / время и PID в ваших журналах. Вы должны быть в состоянии найти проблемный сценарий.
источник
mod_status
оно хорошо справляется со своей задачей.