Из-за чего может долго грузится веб-сервер

283 просмотра
0
0 Комментариев

Всем привет! Столкнулся с такой проблемой. У меня есть веб-сервер Торнадо и работает он по протоколу WebSocket и обычному http. В итоге запустил тестирование, где были подключены 2500 пользователей по websocket. Ну и они слали кучу сообщений серверу, которые дёргали базу данных. Судя по мониторингу ресурсов база данных была загружена не сильно. Но почему-то когда я захожу на страницу размещённую на этом веб-сервер она грузилась очень долго, хотя на ней даже к базе данных запросов нет. Какие факторы могут заставить виснуть веб-сервр? Отмечу, что на сервере поднят также другой веб-сервер и он не виснет.


Добавить комментарий

1 Ответы

Python Опубликовано 14.12.2018
0

Здравствуйте,

Tornado действительно быстр при обработке запросов неблокирующих подписчиков (Websockets соединений), но при этом не стоит забывать что он работает в однопоточном режиме, и блокирующие запросы будут вязнуть.

  1. Разделите по инстансам WebSocket обработчики и обработчик блокирующих запросов. При необходимости можно добавить больше инстансов для обработки обычных запросов, но не желательно запускать больше инстансов, чем количество процессорных ядер. Для балансировки используйте Nginx.

  2. Для тяжелых запросов (отработка алгоритмов требующих задержек времени) необходимо использовать декораторы из родного модуля tornado.gen.

  3. Для работы с БД, лучше использовать многопоточные пулы соединений:

    • Для Postgres хорошо подойдет Momoko;
    • Для MySQL TorMySQL или Tornado-MySQL;

    • Для работы с Redis не рекомендуется использовать многопоточные декораторы. Чаще обработка Redis запросов происходит быстрее чем tornado создает дополнительные нити. Поэтому для быстрых Redis запросов лучше использовать однопоточный обработчик.

  4. В очень тяжелых обработчиках используйте менеджеры очередей Zeromq, RabbitMQ, Gearman или Redis. Сразу после передачи задания в очередь, обработчик tornado готов взять следующий запрос.

Tornado очень быстр в однопоточном режиме, проектируйте приложение используя балнс между необходимостью в дополнительных нитях и продуманным алгоритмом однопоточных обработчиков. Многопоточные обработчики дают хороший результат, но до определенного момента. При повальном загоне всего и вся в отдельные потоки скорость торнадо заметно падает.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up