Каковы основные цели и сценарии проведения стресс-тестирования?

Ответ

Стресс-тестирование проводится для оценки устойчивости системы за пределами нормальной рабочей нагрузки. Ключевые цели:

  • Определить точку отказа — при какой нагрузке система перестаёт корректно работать.
  • Проверить механизмы восстановления — как система ведёт себя после снятия пиковой нагрузки (возвращается ли в нормальное состояние).
  • Выявить узкие места (bottlenecks) в условиях экстремального стресса.
  • Спланировать масштабирование инфраструктуры на основе реальных пределов.

Типичные сценарии для проведения:

  1. Перед запуском высоконагруженных сервисов (например, онлайн-ритейл в Black Friday).
  2. После значительных изменений в архитектуре или миграции на новые серверы.
  3. Для тестирования лимитов и квот (например, rate limiting, пулы соединений БД).

Пример сценария стресс-теста с использованием Locust:

from locust import HttpUser, task, between

class StressTestUser(HttpUser):
    wait_time = between(0.1, 0.5) # Агрессивная частота запросов

    @task
    def overload_api(self):
        # Создаём нагрузку, превышающую нормальную в 10-100 раз
        self.client.get("/api/v1/products", name="Get Products Stress")
        self.client.post("/api/v1/orders", 
                         json={"product_id": 1, "quantity": 100},
                         name="Create Order Stress")

Анализируемые метрики: время отклика (p95, p99), частота ошибок (HTTP 5xx, таймауты), потребление CPU/RAM, поведение сборщика мусора (для JVM), показатели базы данных.

Ответ 18+ 🔞

А, стресс-тестирование! Это ж когда мы берём нашу систему и начинаем её ебать, как ту самую Муму, пока она не скажет «Му-у-у» и не пойдёт ко дну. Цель — не просто сломать, а понять, на каком именно хуе она сломается и как потом будет ползать, пытаясь собрать своё ебало в кучу.

Вот смотри, зачем это всё, кроме как для садистского удовольствия:

  • Найти точку, где всё идёт по пизде. Не «ой, лагает», а конкретно — при скольки тысячах запросов в секунду она выдаёт вместо ответа «500 Internal Server Error» или просто наглухо вырубается, как пьяный мужик в сугробе.
  • Посмотреть, очухается ли она. Сняли нагрузку — и что? Самостоятельно отдышалась, поднялась и снова готова работать? Или лежит, как убитая, и требует ручного перезапуска всех сервисов, потому что connection pools в говне?
  • Выявить узкие места, эти bottleneck'ы ебаные. Может, всё летает, а одна хреновая таблица в БД под нагрузкой лочится, и вся система встаёт колом, ожидая, пока какая-то долбоёбина транзакцию завершит.
  • Понять, на какой хуй нам масштабироваться. Чтобы не гадать, «а может, ещё два инстанса добавим?», а знать точно: вот до 10к RPS тянет, а дальше — пиздец, надо или кэш пересматривать, или базу шардить.

Когда этим стоит заниматься, кроме как от скуки?

  1. Перед какой-нибудь ебейшей акцией, типа Чёрной Пятницы. Чтобы не было так, что все прибежали за скидками, а сайт лежит, и единственное, что показывает — это 504 Gateway Timeout. Пиздец и позор.
  2. После крупных изменений. Переехали на новые сервера, обновили фреймворк — а ну-ка, сука, покажи, что ты теперь можешь. Или не можешь.
  3. Чтобы проверить лимиты. Rate limit'ы, лимиты на пулы соединений в БД — они же как предохранители. Надо знать, когда они перегорят, и что будет после этого: система грациозно начнёт отказывать, или устроит каскадный пиздец на все смежные сервисы.

Вот, смотри, как это примерно выглядит в коде. Locust — инструмент простой, но злобный, как Герасим с мешком.

from locust import HttpUser, task, between

class StressTestUser(HttpUser):
    wait_time = between(0.1, 0.5) # Интервалы между запросами — просто смешные. Жрём систему, как не в себя.

    @task
    def overload_api(self):
        # Делаем то, что делают обычные пользователи, только в 100 раз чаще и идиотски.
        self.client.get("/api/v1/products", name="Get Products Stress")
        self.client.post("/api/v1/orders", 
                         json={"product_id": 1, "quantity": 100},
                         name="Create Order Stress")

А дальше самое важное — смотреть, куда система начинает срать. Не просто «ой, ошибки попёрли», а именно:

  • Время отклика (p95, p99). Когда 95% запросов — быстро, а эти последние 5% — просто пиздец какие долгие? Вот там и копать.
  • Частота ошибок. Не просто 5xx, а какие именно? Таймауты? OutOfMemoryError? БД connection pool exhausted? Каждая ошибка — это крик системы «ПОМОГИТЕ, Я НЕ МОГУ!».
  • Потребление CPU/RAM. Упирается в потолок и не может выше? Или память утекает, как вода в песок, и её уже ничем не остановить?
  • Поведение базы данных. Количество активных соединений, deadlock'и, скорость выполнения запросов. Часто именно БД оказывается той самой несчастной Муму, которую топят в озере высоконагруженные запросы.

Короче, смысл в том, чтобы устроить системе такой пиздец, который в проде случиться не должен, но мы-то должны знать, что будет, если он всё-таки случится. Чтобы не охуеть потом в самый ответственный момент.