2015-11-04 3 views
3

Я работаю над приложением, в котором мне может потребоваться зарегистрировать весь трафик, достигающий сервера. Эта функция может быть включена или выключена, или может использоваться, когда исключены исключения.Вход в асинхронный сервер Tornado (python)

В любом случае, меня беспокоит проблема блокировки операций ввода-вывода на диске и их влияние на производительность сервера. Бизнес-логика, применяемая при обработке запроса (в основном, HTTP-запросы POST), является асинхронной, так что каждый вызов сети или db выполняется асинхронно.

С другой стороны, меня беспокоит задержка в потоке, пока она ждет завершения операции ввода-вывода диска. Зарегистрированные сообщения могут быть от нескольких байтов до нескольких КБ, но в некоторых случаях несколько МБ. Нет необходимости в том, чтобы поток приостанавливался, пока данные записываются на диск, HTTP-запрос может быть завершен в этот момент, и нет причин, по которым нить ioloop не будет работать с другой задачей, пока данные записываются на диск.

Так что мои вопросы:

  1. утра я слишком беспокоюсь по этому вопросу? записывается на стандартный вывод и позже перенаправляет его в файл «достаточно хорошо»?
  2. Каков общий подход или тот, который вы нашли наиболее практичным для регистрации в приложениях на основе торнадо? даже для простой регистрации, а не (крайний) случай, описанный выше?
  3. - это, по сути, идеальный случай для организации очередей сообщений журнала и их потребления из выделенного потока?
  4. Скажите, что я выгружаю ведение журнала в другую тему (например, «Не может кто-нибудь еще это сделать?»), Если поток, который выполняет регистрацию диска, ждет завершения операции с диском io, ли Linux Ядро воспринимает эту точку как возможность переключения контекста?

Любые комментарии или предложения очень ценятся,

Эрез

ответ

3

Для «нормальных» лесосечных (несколько строк в запросе), я всегда находил входа непосредственно в файл, чтобы быть достаточно хорошим , Это может быть неверно, если вы регистрируете весь трафик на сервере. Когда-то мне нужно было сделать что-то подобное, я просто захватил трафик извне с tcpdump вместо изменения моего сервера.

Если вы хотите захватить его в процессе, начните с просто записи в файл из основного потока. Как всегда, измерьте вещи в своей собственной среде, прежде чем принимать решительные меры (IOLoop.set_blocking_log_threshold полезен для определения того, является ли ваш журнал проблемой).

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

+0

Спасибо, Бен. Это был тот ответ, который я искал. – ErezK

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