Всем привет! Столкнулся с такой проблемой. У меня есть веб-сервер Торнадо и работает он по протоколу WebSocket и обычному http. В итоге запустил тестирование, где были подключены 2500 пользователей по websocket. Ну и они слали кучу сообщений серверу, которые дёргали базу данных. Судя по мониторингу ресурсов база данных была загружена не сильно. Но почему-то когда я захожу на страницу размещённую на этом веб-сервер она грузилась очень долго, хотя на ней даже к базе данных запросов нет. Какие факторы могут заставить виснуть веб-сервр? Отмечу, что на сервере поднят также другой веб-сервер и он не виснет.
Здравствуйте,
Tornado действительно быстр при обработке запросов неблокирующих подписчиков (Websockets соединений), но при этом не стоит забывать что он работает в однопоточном режиме, и блокирующие запросы будут вязнуть.
-
Разделите по инстансам WebSocket обработчики и обработчик блокирующих запросов. При необходимости можно добавить больше инстансов для обработки обычных запросов, но не желательно запускать больше инстансов, чем количество процессорных ядер. Для балансировки используйте Nginx.
-
Для тяжелых запросов (отработка алгоритмов требующих задержек времени) необходимо использовать декораторы из родного модуля tornado.gen.
-
Для работы с БД, лучше использовать многопоточные пулы соединений:
- Для Postgres хорошо подойдет Momoko;
-
Для MySQL TorMySQL или Tornado-MySQL;
-
Для работы с Redis не рекомендуется использовать многопоточные декораторы. Чаще обработка Redis запросов происходит быстрее чем tornado создает дополнительные нити. Поэтому для быстрых Redis запросов лучше использовать однопоточный обработчик.
-
В очень тяжелых обработчиках используйте менеджеры очередей Zeromq, RabbitMQ, Gearman или Redis. Сразу после передачи задания в очередь, обработчик tornado готов взять следующий запрос.
Tornado очень быстр в однопоточном режиме, проектируйте приложение используя балнс между необходимостью в дополнительных нитях и продуманным алгоритмом однопоточных обработчиков. Многопоточные обработчики дают хороший результат, но до определенного момента. При повальном загоне всего и вся в отдельные потоки скорость торнадо заметно падает.