Использование:
http://code.google.com/p/modwsgi/wiki/DebuggingTechniques#Extracting_Python_Stack_Traces
для встраивания функций, которые вы можете запускать в то время, когда ожидаете зависшие запросы, и узнаете, что они делают.Скорее всего, запросы накапливаются с течением времени, а не происходят одновременно, поэтому вы можете делать это периодически, а не ждать полного сбоя.
В качестве отказоустойчивого устройства вы можете добавить параметр:
inactivity-timeout=600
в директиву WSGIDaemonProcess.
Что это сделает, перезапустит процесс в режиме демона, если он неактивен в течение 10 минут.
К сожалению, в настоящее время это происходит в двух сценариях.
Во-первых, когда в течение 10 минут вообще не было никаких запросов, процесс будет перезапущен.
Второй, и тот, который вы хотите запустить, - это если все потоки запросов заблокированы.и никто из них не прочитал никаких входных данных из wsgi.input и не дал никакого содержимого ответа, через 10 минут процесс снова будет перезапущен автоматически.
Это будет по крайней мере означать, что ваш процесс должен восстановиться автоматически итебя не вызовут из постели.Поскольку вы запускаете так много процессов, есть вероятность, что они не будут все застревать одновременно, поэтому перезапуск не должен быть замечен новыми запросами, так как другие процессы все равно будут обрабатывать запросы.
Что вы должны работатькак мало вы можете сделать это время ожидания.Вы не хотите, чтобы он был настолько низким, что процессы будут перезапущены из-за отсутствия запросов вообще, поскольку это приведет к выгрузке приложения, а следующий запрос, если используется отложенная загрузка, замедлится.
Что я должен сделать, так это добавитьновый параметр заблокированный тайм-аут, который специально проверяет все запросы, блокируемые на определенный период, поэтому отделяет его от перезапусков из-за отсутствия запросов вообще.Это сделало бы это более гибким, так как перезапуск из-за отсутствия запросов приводит к собственным проблемам с загрузкой приложения снова.
К сожалению, сложно реализовать тайм-аут запроса, который применяется к одному запросу, потому что конфигурация хостингаможет быть многопоточным.Внедрение исключений Python в запрос не обязательно разблокирует поток, и в конечном итоге вам придется все равно завершить процесс и прервать другие параллельные запросы.Таким образом, заблокированное время ожидания, вероятно, лучше.
Еще одна интересная вещь, которую я могу сделать, - добавить в mod_wsgi материал, чтобы сообщить о таких принудительных перезапусках из-за заблокированных процессов в агент New Relic.Это было бы здорово, если бы вы увидели их в инструменте мониторинга.: -)