Короткий ответ
Нужно тестировать поведение системы на реалистичном профиле нагрузки (смесь типов запросов, распределение по времени, постепенный рост) и смотреть на набор метрик — задержку по перцентилям (p50/p95/p99), частоту ошибок, использование ресурсов, поведение под пиковой и длительной нагрузкой, — а не только на пиковый RPS, который сильно зависит от окружения теста и конкретной конфигурации.
Как это работает подробнее
Нагрузочный тест (например, через locust или k6) эмулирует параллельных пользователей по сценарию, близкому к реальному трафику, и собирает распределение времени ответа, а не только среднее значение — среднее легко маскирует то, что часть запросов (например, p99) отвечает на порядок медленнее из-за блокировок, N+1-запросов или исчерпания пула соединений с БД под нагрузкой.
Сравнение
- Компромисс. Подробное многометриковое нагрузочное тестирование с реалистичным профилем трафика даёт более достоверную картину, но требует значительных усилий на подготовку сценариев и инфраструктуры, а также времени на прогон (особенно soak-тесты). Быстрый микробенчмарк дешевле и даёт сигнал быстрее, но легко вводит в заблуждение относительно реального поведения под production-нагрузкой. Критерий выбора: для критичных по SLA систем оправдано регулярное, а не разовое нагрузочное тестирование с фиксацией условий прогона, чтобы результаты были сравнимы во времени и отражали реальные регрессии, а не шум окружения.
Пример кода
from locust import HttpUser, task, between
class ApiUser(HttpUser):
wait_time = between(0.1, 0.5)
@task(3)
def get_order(self):
self.client.get("/orders/42")
@task(1)
def create_order(self):
self.client.post("/orders", json={"items": [{"sku": "A1", "qty": 2}]})
# Отчёт locust фиксирует p50/p95/p99 задержки и % ошибок под заданным
# числом одновременных пользователей — это и есть предмет анализа,
# а не единственное число RPS.Что использовать на практике
- Практика. Важно тестировать не только пиковую нагрузку, но и длительную (soak-тест), чтобы заметить деградацию, которая проявляется только со временем — утечки памяти, рост фрагментации соединений, накопление данных, не удаляемых фоновыми задачами. Результаты одного прогона на нестабильном или нерепрезентативном окружении (другая конфигурация железа, другая версия зависимостей) нельзя напрямую сравнивать с production без воспроизведения сопоставимых условий.
Подводные камни
- Риск. Сообщать результат одного короткого прогона («система держит 5000 RPS») без указания условий (размер данных, профиль запросов, конфигурация окружения, перцентили задержки) как универсальный факт о производительности системы. Оптимизировать исключительно под синтетический бенчмарк, не отражающий реальный профиль трафика (например, тестировать только одинаковые лёгкие запросы, когда в production преобладают тяжёлые отчётные запросы).