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