2013-09-14 5 views
3

В какой-то момент после запуска моего webapp я начинаю получать предупреждения Can't handle a new request, too many request threads already от hunchentoot с соответствующим ответом на HTTP-сервис, недоступным в браузере. Проблема заключается в том, что это никогда не возвращается к нормальной обработке запросов, то есть, если какой-либо обработчик запросов «зависает», даже не возвращаясь, когда при вызове достаточного количества этих обработчиков максимальное количество потоков попадает и остается таким. Как я могу получить список текущих потоков и проверить текущий стек вызовов одного из них, чтобы я мог проверить, где проблема? Это даже имеет смысл? Я не получаю никаких других предупреждений. Любые советы о том, как начать расследование?Отладка обработчиков запросов в hunchentoot

+4

hunchentoot использует бордо-нитки. '(bt: all-threads)' будет перечислять текущие потоки. – martin

+0

@severin Как просмотреть или отслеживать определенный поток, чтобы увидеть дерево вызовов во время его работы? – Paralife

ответ

2

Я наблюдаю то же поведение с SBCL (в Windows). Кажется, что проблема заключается в том, что клиент отправляет заголовок Keep-Alive, который выполняет хенчэнт-почет, сохраняя рабочий поток после обработки запроса. Он сидит в режиме ожидания, ожидая дальнейшего ввода, но, к сожалению, кажется, что сокет никогда не истекает, и нить никогда не прекращается, поэтому я очень быстро попал на неработоспособный сервер. Это похоже на проблему с Windows, потому что тот же код отлично работает под Linux (Ubuntu).

@Paralife вы можете приостановить поток и проверить его стек вызовов с

(BT: прерывание-нить нить перерыв # ')

Вы можете получить нить, Вы хотите использовать (Bt: все-ниточный).

Смежные вопросы