Я администрирую загруженный веб-сервер, который использует nginx / php-fpm, подключается к mysql (RDS) и elasticsearch, но также на сайте есть много третьих сторон для рекламы и других плагинов и т. Д. (К сожалению, я не знаю всех деталей) .
Меня беспокоит случайная и периодически возникающая проблема, иногда рабочие php-fpm начинают накапливаться, в результате этого также происходит процессор, подключения к sql и, в конечном итоге, процессор sql - к счастью, это никогда не длится слишком долго.
Я уверен, что это что-то удаленное, так как это происходит одновременно со всеми серверами, которые сейчас находятся под LB.
Судя по моему исследованию и тестированию, я думаю, что обнаружил это на веб-уровне, из-за которого процессы php зависают.
Я считаю, что могу исключить подключения к моему кластеру ES, а также к RDS по нескольким причинам: - Отдельный мониторинг ES от конкретного хоста, имеющего проблемы, теперь показывает проблемы - Все подключения к ES / SQL выполняются через уровень api, отображаются журналы api нет неудачных запросов (499/502), поскольку я получаю в веб-журналах. - Скрипт проверки работоспособности, который работает на php, вызывает данные из ES и SQL с самого веб-сервера, также не показывает проблем, в то время как веб-уровень начинает возвращать 499/502 - Дальнейший общий мониторинг среды SQL и ES не показывает никаких проблем.
Это также не внезапное увеличение количества подключений / атак - оглядываясь назад на показатели балансировщика нагрузки, вы не обнаружите ничего беспокоящего, кроме увеличения задержки, когда проблемы начинают действовать.
Я подозреваю, что часть запроса php к веб-уровню требует, чтобы он генерировал ответ, который включает данные из внешних источников, некоторые из которых иногда не отвечают и вызывают зависание ответа сервера.
Мне нужен способ доказать (или опровергнуть) это и идентифицировать соединения, я смотрел netstat, возможно, wirehark, но я мог бы помочь с определением команды, которая будет выделять либо сбой исходящего соединения, либо зависание - просто чтобы быть возможность регистрировать любые исходящие соединения, которые занимают определенное время, была бы очень полезна, если проблемы совпадают с этими журналами, тогда я буду на правильном пути с некоторыми подсказками.
Я знаю, как сделать это, как только соединения начнут истекать по таймауту, если нецелесообразно запускать его непрерывно.
Надеюсь, вы, ребята, дадите мне несколько идей :)
Спасибо
Единственный способ получить необходимые данные - это выполнить захват пакета с полной информацией о пакете. Что-то вроде:
$ tcpdump -s0 -w packet.cap port 80 or port 443
Предупреждение: это займет дисковое пространство, поэтому убедитесь, что у вас достаточно места для захвата пакетов. После прохождения этого периода, когда проблема наблюдается, скопируйте файл локально и изучите его с помощью wirehark. Вы сможете проверить полные потоки TCP и HTTP-вызовы / ответы, как инициированные клиентами, так и инициированные вашим сервером.
Однако я бы спросил ... уверены ли вы, что ваш сервер действительно запрашивает эти внешние ресурсы, а затем обслуживает их своим клиентам? В подавляющем большинстве случаев рекламные сети и тому подобное служат прямо в браузеры клиентов, а не через ваш веб-сервер.