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

Как отследить процесс Apache с высокой загрузкой ЦП до конкретного виртуального хоста

Глядя на результат top Я замечаю, что время от времени один или два процесса Apache потребляют много ресурсов ЦП - где-то между 50% - 90%.

Скачки в загрузке процессора приходят и уходят довольно быстро каждые 10 секунд или около того.

Существуют различные другие запущенные процессы Apache, которые потребляют от 2% до 4%.

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

я пробовал lsof а также глядя на вывод server-status но поскольку процессы длятся недолго, идентификатор процесса используется повторно, и его невозможно привязать к виртуальному хосту, вызывающему проблему.

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

Я также проверил журнал медленных запросов MySQL, и он не обнаружил ничего интересного.

Моя рекомендация: добавьте время отклика в свои логи.

Это не идеально, поскольку нет гарантии, что запросы, вызывающие всплески, обслуживаются дольше, чем другие, но это вполне вероятно и дает вам отправную точку для расследования.

Для этого вам нужно определить новый LogFormat и CustomLog, который включает параметр% D. Увидеть Apache документация по mod_log_config.

Другой вариант, который, вероятно, слишком низкоуровневый, но может дать вам представление о характере нагрузки, - это связать родительский процесс apache с помощью -f, чтобы следовать за дочерними элементами, и -c, чтобы показать время процессора для каждого вызова , например strace -f -c -p <apache parent pid>

Как только вы узнаете, какие системные вызовы занимают больше всего времени, вы сможете отследить их напрямую. Например, предположим, что сервер тратит много времени на write (), тогда вы можете сделать strace -f -e trace=write -p <apache parent pid>, и рассмотрите эти звонки более подробно.