Gunicorn + Gevent: отладка рабочих из-за зависания состояния / РАБОЧЕЕ ВРЕМЯ причина
Я использую очень простой веб-сервер, использующий Django на Gunicorn с работниками Gevent, которые общаются с MySQL для простых операций типа crud. Все это за nginx и размещено на AWS. Я запускаю свой сервер приложений, используя следующую конфигурацию:
gunicorn --logger-class=simple --timeout 30 -b :3000 -w 5 -k gevent my_app.wsgi:application
Однако иногда рабочие просто застревают (иногда, когда количество запросов увеличивается. Иногда даже без него), и TPS падает, когда nginx возвращает код ошибки 499 HTTP. Иногда рабочих начали убивать (WORKER TIMEOUT
) и запросы сброшены.
Я не могу найти способ отладки, когда рабочие застревают. Я проверил медленные журналы MySQL, и это не проблема здесь.
На Яве я могу взять jstack
чтобы увидеть состояние потоков или некоторые другие механизмы, такие как takipi
который обеспечивает состояние потоков тогда, когда возникает исключение.
Для всех людей, которые могут помочь, я призываю вас помочь мне найти способ увидеть внутреннее состояние размещенного веб-сервера Python, т.е.
- рабочие заявляют в данный момент
- состояние потоков в заданной точке
- которые все запросы конкретного работника gevent начали обрабатывать и когда он застревает / убивается, где он на самом деле застревает
- все запросы были прекращены из-за убийства работника
- так далее
Я искал это и нашел много людей, сталкивающихся с подобными проблемами, но их решения кажутся хитрыми и пробными, и нигде нет упомянутых шагов о том, как углубиться в это.