Как получить трассировку стека на всех запущенных рубиновых потоках на пассажирском - PullRequest
6 голосов
/ 01 февраля 2011

У меня есть производственное приложение ruby ​​sinatra, работающее на nginx / passenger, и я часто вижу, что запросы необъяснимо застопорились.Я написал скрипт для вызова статуса пассажира на моем кластере машин каждые десять секунд и отображал результаты на графике.Вот что я вижу:

enter image description here

Синяя линия показывает глобальную очередь, ожидающую пика до 60. Это среднее значение для 4 машин, поэтому, когда синяя линия достигает 60,это означает, что каждая машина доведена до максимума.У меня установлено значение passenger_max_pool_size, равное 20, поэтому он в 3 раза превышает максимальный размер пула, а затем, вероятно, отбрасывает последующие запросы.

Мое приложение зависит от двух ключевых внешних ресурсов - бэкэнда Amazon RDS mysql и экземпляра Redis.Возможно, один из них периодически становится медленным или не отвечает и, таким образом, вызывает такое поведение?

Может кто-нибудь посоветовать мне, как получить трассировку стека, чтобы увидеть, является ли узкое место здесь Amazon RDS, Redis или что-то еще?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 01 февраля 2011

Я понял это - у меня был параметр конфигурации SAVE в Redis, который запускался раз в минуту.Очевидно, что для моего приложения блокировка / сохранение операций redis блокируются.Я изменяю параметр конфигурации на «3600 1», что означает, что я сохраняю свою базу данных только один раз в час, и это нормально, потому что я использую ее в качестве кэша (данные сохраняются в MYSQL).

0 голосов
/ 01 апреля 2016

Чтобы ответить на ваш оригинальный вопрос, можно получить «все следы стека» для запущенных процессов ruby, которые пасует пассажир. По сути, отправьте сообщение SIGQUIT каждому, и они выплюнут все свои обратные следы в файл журнала apache / nginx, например:

https://gist.github.com/rdp/905759f88134229c2969b9f242188615

...