Вопрос или проблема
Я довольно нов в использовании Redis. Я разрабатываю API на Python и Flask, который использует Redis. Я хотел протестировать API с помощью Locust на локальном уровне. Мне было любопытно, как он отличается от Heroku. Тестирование API, размещенного на Heroku, с помощью Locust работает нормально и создает всего несколько соединений (~5). Но когда я пытаюсь протестировать локально, каждый запрос от Locust – это новое соединение. Что здесь происходит? Это ожидаемо? Отправляет ли Heroku запросы в Redis иначе, если да, то как? Мне любопытно понять разницу.
Примечание: я также пытался запускать через gunicorn и waitress локально.
Локальные результаты (gunicorn):
Тип | Имя | # запросов | # сбоев | Средний | Минимум | Максимум | Медиана | запросов/с | сбоев/с |
---|---|---|---|---|---|---|---|---|---|
GET | /data | 377 | 304 | (80.64%) | 825 | 299 | 2645 | 840 | 5.91 |
POST | /submit | 1048 | 988 | (94.27%) | 817 | 162 | 2562 | 840 | 16.44 |
—– | ———— | ——- | ——- | ——- | ——- | ——- | ——- | ——- | ——- |
Всего | Суммарно | 1425 | 1292 | (90.67%) | 819 | 162 | 2645 | 840 | 22.36 |
Результаты Heroku:
Тип | Имя | # запросов | # сбоев | Средний | Минимум | Максимум | Медиана | запросов/с | сбоев/с |
---|---|---|---|---|---|---|---|---|---|
GET | /data | 8492 | 0 | (0.00%) | 1236 | 143 | 8100 | 960 | 35.44 |
POST | /submit | 25371 | 13716 | (54.06%) | 560 | 140 | 2609 | 420 | 105.87 |
—– | ———— | ——- | ——- | ——- | ——- | ——- | ——- | ——- | ——- |
Всего | Суммарно | 33863 | 13716 | (40.50%) | 729 | 140 | 8100 | 510 | 141.31 |
Примечание: Сбои на отправке в Heroku не ноль, потому что я забыл отключить лимит запросов
Ответ или решение
Разница в тестировании локальных и продакшн-сред Flask-приложения с использованием Redis через Locust
Разработка API с использованием Flask и Redis — это мощный способ построения высоконагруженных приложений, но как вы уже заметили, результаты нагрузочного тестирования могут значительно различаться между локальной и продакшн-средой, когда вы используете платформу Heroku. Давайте рассмотрим основные аспекты, которые могут влиять на различия в результатах тестирования.
1. Разные окружения
При локальном тестировании и тестировании на Heroku существует множество факторов, которые могут вызвать различия в производительности:
-
Операционная система: Локально вы можете использовать разные версии ОС, которые могут работать иначе, чем среда Heroku.
-
Конфигурация сервера: Например, различные конфигурации Gunicorn и Waitress могут повлиять на управление потоками и процессами, что также отразится на обработке запросов.
-
Настройка Redis: Возможно, в локальной среде Redis настроен иначе, чем в продакшн. Проверьте параметры такого кэширования, как максимальное количество соединений.
2. Уровень масштабирования
Heroku по умолчанию управляет масштабированием легко и предоставляет устойчивую и управляемую инфраструктуру. Это включает в себя использование нескольких dyno для обработки большего числа одновременных запросов. В случае локального тестирования:
-
Однопоточность: Если вы используете Gunicorn с одним рабочим процессом, это может вызвать узкие места, особенно при большом количестве запросов.
-
Подключения: Если каждый запрос из Locust использует новое соединение к Redis, это может привести к увеличенной перегрузке. Убедитесь, что вы используете обработчики соединений с Redis, которые повторно используют соединения вместо их создания при каждом запросе.
3. Настройки Locust
-
Количество пользователей: Убедитесь, что вы устанавливаете одинаковое количество пользователей в Locust при локальном тестировании и на Heroku. Повышение нагрузки из-за несоответствия конфигураций может влиять на результаты.
-
Шаблоны нагрузки: Проверьте, как Locust генерирует нагрузки и как распределяются запросы. Разные сценарии тестирования могут приводить к значительным отклонениям в производительности.
4. Производительность Redis
Redis работает как высокопроизводительный кэш и сервис хранения ключ-значение. В зависимости от конфигурации:
-
Что делать с подключениями?: Важно использовать управляющие пулом соединений. Попробуйте добавить библиотеку, которую вы можете использовать для управления соединениями для Redis, что позволить избежать большого количества открытых соединений, которые могут повлиять на производительность.
-
Мониторинг: Используйте инструменты мониторинга (например, Redis Monitor) для отслеживания производительности кэша в обоих окружениях. Это может помочь обнаружить узкие места.
5. Настройки ожидания
Heroku может иметь настройки тайм-аутов соединений и ожиданий, которые отличаются от локальных настроек. Убедитесь, что вы используете одинаковые таймауты и ожидания для обоих окружений.
Заключение
Определение различий в нагрузочном тестировании между локальной и продакшн-средой — задача сложная, но благодаря систематической проверке окружений, конфигураций и инфраструктуры можно выявить причину таких несоответствий. Убедитесь, что вы выполняете стресс-тесты в условиях, максимально приближенных к продакшн-среде, и используете правильные методы управления соединениями. Это даст вам более точное представление о поведении вашего API под нагрузкой и позволит избежать неожиданных проблем в будущем.