@armodim

Как обнаружить причину ошибки 500?

Сайт на LEMP.
Всё работает, за исключением одного из скриптов, запускаемого из CMS. Переходя в него браузер долго думает, в итоге через 40 секунд вываливается в ошибку 500. При этом все 40 секунд ни на одну странцу нельзя зайти, и они так же подвешиваются на этот промежуток времени.
Htop на протяжении этих 40 секунд, показывает такую картину: 100% одного из 8 ядер проца занимает mysqld, через 10-15 секунд mysqld освобождает проц, и теперь 100% занимает пул php-fpm. Потребление ram растет (с 900МБ до 1,4ГБ, при общей памяти 16ГБ), также пул php-fpm.
В debug логах nginx ничего фатального. В логах пула php-fpm тоже ничего особенного.
Как выявить проблемное место?
  • Вопрос задан
  • 152 просмотра
Решения вопроса 4
h0w4rd
@h0w4rd
Тыжпрограммист
Попробуйте дебагеры, логирование а-ля "position 1", "position 2" после каждого существенного действия. Но это не на продакшен сервере естественно. Также вероятно это дыра в запросе в БД. Посмотрите, может там нет "LIMIT 1" какого-то.
Ведь очень похоже, что раз "mysql" кушает процессор и много-много памяти - значит очень тяжелый запрос, скорее всего "SELECT".
И 40 секунд скорее всего - максимальное время ответа что-ли, после веб сервер отдает 500 ошибку. Но в этом я не уверен. Может быть просто PHP падает от размера объекта.
Ответ написан
@remzalp
Программер чего попало на чем попало
Используйте https://xdebug.org/
и что-то, что умеет дебагать удаленно https://xdebug.org/docs/remote

Настраиваете слушать локальный порт сервера, через SSH пробрасываете порт на свой локальный комп, свою IDE настраиваете цепляться к локальному порту.

А ПОТОМ ПОШАГОВО ДЕБАГАЕТЕ.

Можете заодно спрофилировать скрипт, может сразу видно будет, если отсортировать по времени работы.

Благодаря тому, что порт XDEBUG наружу не торчит, обеспечивается хоть какая-то секьюрность. После завершения работ отключаете это расширение, потому что тормозов оно хоть и немного, но добавляет.

Включая своего внутреннего пророка предсказываю - это программист, долгое время писавший на чем-то типа битрикс, сделал запрос вида:
foreach ($results as $item) query("SELECT * FROM table WHERE ID={$item[id]}");


В идеале сделать копию данных, запустить у себя и мучить локально. Если совсем тяжело, то ... сервер все-равно нормально не работает...
Ответ написан
Azmandios
@Azmandios
есть только общая инструкция "смотреть логи". Что скрипт делает ? там по идее бесконечный цикл должен быть, и конкретно ваша 500ая ошибка от перегрузки. При том если вы пишете что грузит mysqld , значит... чую не те логи вы смотрите :) посмотрите что база делает в данный момент, к чему идут обращения. Далее смотреть какое место в коде вызывает зти запросы.
Ответ написан
SagePtr
@SagePtr
Еда - это святое
В MySQL включите лог медленных запросов и посмотрите туда, будет ли там что-нибудь или нет
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы