Проблема масштабируемости (Торнадо). Не могу понять, задерживая запуск
Спасибо, ребята, любые идеи / понимание приветствуются, потому что это сводит меня с ума.
Проблема: только около 3 или 4 пользователей могут использовать сервер одновременно, пока приложение не остановится.
В настоящее время мы наблюдаем резкие скачки в загрузке процессора при нормальном использовании. Это проще воспроизвести для реальных пользователей, чем для автоматических сценариев, по неизвестным причинам, но возможно, что сценарии не справляются с задачей имитации реального использования.
Наша архитектура выглядит следующим образом:
- Сервер приложений (Tornado) - однопоточный, с асинхронным циклом ввода-вывода. Мы используем Tornado для обработки постоянных соединений, связанных с длительным опросом, и отправляем все основные веб-запросы в Django через WSGI.
- Django ORM используется для взаимодействия с базой данных, хотя большинство SQL написано вручную
- База данных MySQL
- Nginx обслуживает статические носители и передает другие запросы Tornado
- В настоящее время все настроено для запуска на одном "малом" экземпляре EC2. Разделение серверов между машинами не оказывает заметного влияния на производительность
См. Спецификацию сервера EC2: http://aws.amazon.com/ec2/instance-types/ для получения дополнительной информации о конфигурации сервера. Примечание. В целом, это не идеальная и наиболее масштабируемая установка, но она должна быть в состоянии обрабатывать более 3 пользователей!
Запуск топ и просмотр журналов показывает следующее:
- Пики ЦП в основном связаны с Tornado, около 25% дополнительного использования ЦП на активного пользователя
- Низкое "время кражи", поэтому EC2 больше не ограничивает мощность нашего процессора (больше)
- Все запросы к БД находятся в диапазоне 0-200 мс, когда процессор не пикирует, но часто 3 или более секунд во время пиков
- Использование памяти низкое и никогда не всплески
Некоторые вещи, которые были опробованы безрезультатно:
- Настройка размеров буфера MySQL, индексов и т. Д. Я на 99% уверен, что это не проблема оптимизации SQL/DB для сада
- Улучшение времени запросов и уменьшение количества запросов всеми видами способов.
- Поместите серверы в отдельные экземпляры ec2
- Прокси между несколькими серверами приложений (это, очевидно, будет гораздо более масштабируемым, но это не решает проблему 3 пользователей на экземпляр)
- Обновите экземпляр EC2. Обновление с "Micro" помогло (из-за проблем с процессором), но только немного увеличило нашу емкость
- Развертывание на сервере не-EC2 (Slicehost) - те же проблемы
- Все серверы прошли индивидуальную нагрузочную проверку с помощью простых тестовых случаев, и все они могут обрабатывать тысячи одновременных подключений.
1 ответ
"Tornado, около 25% дополнительного использования процессора на активного пользователя" - с однопоточным приложением, если каждый пользователь жует 25% ядра, вы получите максимум до 4 пользователей, прежде чем приложение насыщает только ядро, которое оно может использовать. Подумайте, почему Tornado - это такая нелепая нагрузка на процессор (ваш код плохой или Tornado плохой?), И ваше решение не получится.