2014-02-05 2 views
1

Я запускаю простое веб-приложение, которое использует несколько веб-сервисов для каждого запроса, и я обнаружил, что запросы, которые наш сервер делает с тайм-аутом (синтетическая ошибка 599), хотя другая служба всегда реагирует (я это подтвердил).Tornado AsyncHTTPClient запрашивает тайм-аут при средней загрузке

Это вид сообщений об ошибках, которые я получаю:

HTTP 599: Connection timed out after 7005 milliseconds 

(тайм-аут при подключении)

HTTP 599: Operation timed out after 5049 milliseconds with 0 out of -1 bytes received 

(тайм-аут перед получением данных)

HTTP 599: Operation timed out after 10005 milliseconds with 11197 out of 13047 bytes received 

(время с переданными данными частично)

Я смог воспроизвести это в двух разных средах, в мини-экземпляре Amazon EC2 и моем Macbook Pro (i7). В экземпляре EC2 тайм-ауты начинаются с двух одновременных клиентов, выполняющих запросы, Macbook держится до 8 одновременных клиентов, затем он также начинает показывать таймауты.

Я пробовал несколько вещей, таких как обновление версии Tornado (2.2, 2.3.1, 2.4.1 и 3.1.1, если я хорошо помню), изменяя базовую реализацию AsyncHTTPClient от простой по умолчанию до основанной на pycurl и увеличение числа асинхронных клиентов (до 200), но ошибка все еще происходит.

Я не уверен, что я могу быть возможно делать неправильно, потому что это не выглядит как обещанного масштабируемость, что Торнадо должен доставить на всех ...

Любые намеки?

обновление

только для записи, мы использовали memcache в асинхронном обратном вызове, но библиотека не ASync себя. Я заменил его на: https://github.com/dpnova/tornado-memcache/

Это была самая большая проблема, о которой я думаю, хотя время от времени мы все еще получаем 599.

ответ

1

Похоже, что ваш код может блокировать цикл событий где-нибудь (для целого числа секунд - есть ли у вас какие-либо вызовы time.sleep()?). Попробуйте использовать IOLoop.set_blocking_log_threshold, чтобы найти места, где цикл событий блокируется.

+0

не спит вообще, но я попробую 'IOLoop.set_blocking_log_threshold' ... Спасибо! :) – fortran

+0

К сожалению, трассировки стека кажутся довольно случайными, так как не существует ни одного места, где выполняется блокировочное вычисление :(Иногда это фрагмент кода, который манипулирует некоторыми ответами json, чтобы сделать их более дружелюбными, в другое время в шаблоне render ... – fortran

+0

Какой порог вы используете? Если вы видите трассировку стека на всех, что предполагает, что вы делаете * что-то, что слишком медленно для использования на неблокирующем сервере. –

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