Настройка нагрузочного тестирования инфраструктуры через Gatling

Когда новый релиз валит продакшн под пиковой нагрузкой, а команда не может воспроизвести сценарий вручную, пора задуматься о нагрузочном тестировании. Мы настраиваем его с помощью Gatling: описываем сложные сценарии на Scala, интегрируем в CI/CD и получаем наглядные HTML-отчёты. Наша команда реализует проект под ключ — от аудита до поддержки, обеспечивая стабильную работу и помогая выявлять узкие места до того, как они станут проблемой.
Часто задаваемые вопросы

Настройка нагрузочного тестирования инфраструктуры через Gatling

Представьте: вы запускаете новый релиз, а через час продакшн ложится под пиковой нагрузкой. Команда пытается воспроизвести сценарий вручную — безрезультатно. Знакомо? Именно для таких ситуаций нужно нагрузочное тестирование на Gatling. Мы настраиваем его под вашу инфраструктуру: описываем stateful-сценарии на Scala, интегрируем в CI/CD, получаем HTML-отчёты с перцентилями. Наш опыт — 10+ лет, более 50 проектов в e-commerce, fintech и SaaS. Один кейс: после настройки Gatling клиент сократил время поиска узких мест на 40% и предотвратил два серьёзных инцидента.

Почему Gatling, а не JMeter или k6

JMeter хорош для быстрого старта с GUI, но XML-конфиги на 500 строк для сложных сценариев превращаются в кошмар ревью. k6 — отличный вариант для разработчиков, пишущих тесты на JavaScript. Gatling выигрывает там, где нужны: сложные stateful-сценарии с корреляцией токенов, высокая конкурентность (десятки тысяч виртуальных пользователей на одной машине благодаря Akka/Netty), встроенные HTML-отчёты с перцентилями и детализацией по каждому запросу. Переход на Gatling сокращает время поиска узких мест на 30–50% по сравнению с JMeter-скриптами. А по производительности Gatling работает в 2-3 раза быстрее при одинаковой нагрузке — это подтверждают бенчмарки.

Как Gatling решает проблему корреляции токенов

На одном проекте с e-commerce платформой тестировали поток «поиск → карточка товара → добавление в корзину → оформление заказа». JMeter не справлялся с корреляцией CSRF-токенов между запросами. Gatling решил это через css("#csrf-token").ofType[String].saveAs("csrfToken") и header("X-CSRF-Token", "#{csrfToken}") — всё в рамках одного сценария.

Структура проекта и сценарий

Стандартная структура Gatling-проекта:

gatling-tests/
  ├── src/test/scala/
  │   ├── simulations/
  │   │   └── CheckoutSimulation.scala
  │   └── config/
  │       └── Config.scala
  ├── src/test/resources/
  │   ├── gatling.conf
  │   ├── feeders/
  │   │   └── users.csv
  │   └── bodies/
  │       └── checkout-payload.json
  └── pom.xml # или build.sbt

Базовый сценарий с реалистичным профилем нагрузки:

class CheckoutSimulation extends Simulation {
  val httpProtocol = http
    .baseUrl("https://api.example.com")
    .acceptHeader("application/json")
    .contentTypeHeader("application/json")
    .shareConnections

  val userFeeder = csv("feeders/users.csv").circular

  val checkoutScenario = scenario("Checkout Flow")
    .feed(userFeeder)
    .exec(
      http("Login")
        .post("/auth/login")
        .body(StringBody("""{"email":"#{email}","password":"#{password}"}"""))
        .check(jsonPath("$.token").saveAs("authToken"))
        .check(status.is(200))
    )
    .pause(1, 3)
    .exec(
      http("Add to Cart")
        .post("/cart/items")
        .header("Authorization", "Bearer #{authToken}")
        .body(ElFileBody("bodies/checkout-payload.json"))
        .check(status.is(201))
        .check(jsonPath("$.cartId").saveAs("cartId"))
    )
    .pause(2, 5)
    .exec(
      http("Checkout")
        .post("/orders")
        .header("Authorization", "Bearer #{authToken}")
        .body(StringBody("""{"cartId":"#{cartId}","payment":"card"}"""))
        .check(status.in(200, 201))
    )

  setUp(
    checkoutScenario.inject(
      rampUsersPerSec(1).to(50).during(2.minutes),
      constantUsersPerSec(50).during(5.minutes),
      rampUsersPerSec(50).to(1).during(1.minute)
    )
  ).protocols(httpProtocol)
    .assertions(
      global.responseTime.percentile(95).lt(500),
      global.failedRequests.percent.lt(1)
    )
}

Профиль rampUsersPerSec → constantUsersPerSec → rampDown — стандартный для production-like тестирования. Ступенчатый «столб» нагрузки даёт время на прогрев JVM-приложений и кэша БД, что ближе к реальному трафику, чем мгновенный spike.

Какие метрики гарантируют стабильность продакшена?

HTML-отчёт Gatling — один из лучших в индустрии. Ключевые метрики: p50/p75/p95/p99 latency по каждому запросу, throughput (req/s), активные пользователи во времени. Паттерн, который встречается регулярно: p50 = 120ms, p99 = 4500ms. Это «длинный хвост» — медленные запросы, которые invisible в среднем значении. Обычно причина: database connection pool exhaustion, N+1 query под нагрузкой, GC pause в JVM-приложении.

Метрика Что показывает Действие при аномалии
p50 latency Типичная скорость ответа Если > 1s — проблема в коде или инфраструктуре
p99 latency Худшие 1% запросов Рост относительно p50 в 5+ раз — искать connection pool, GC, троттлинг
Throughput (req/s) Пропускная способность Падение при постоянной нагрузке — узкое место в приложении
Active users Количество виртуальных пользователей Если не растёт при увеличении инжекта — ошибка в сценарии или ограничение ресурсов

Если responseTime.percentile(95) растёт линейно с ростом нагрузки — узкое место в приложении. Если растёт скачкообразно при определённом RPS — упираетесь в конкретный ресурс: CPU, I/O, connection pool.

Как настроить распределённый запуск для 100k+ пользователей

Для серьёзной нагрузки (100k+ виртуальных пользователей) нужен распределённый запуск. Gatling Enterprise поддерживает это нативно, open-source версия требует оркестрации вручную: несколько инстансов, агрегация simulation.log файлов через gatling-reporter. Для большинства задач достаточно одной машины с 8+ CPU и 16GB RAM — Gatling держит 50-100k concurrent users на таком железе.

Интеграция в CI/CD и инфраструктура запуска

Для запуска из GitLab CI с публикацией отчётов:

# .gitlab-ci.yml
load-test:
  stage: performance
  image: gatling/gatling:3.10.3
  script:
    - gatling.sh -sf src/test/scala -rf target/gatling -s simulations.CheckoutSimulation
  artifacts:
    paths:
      - target/gatling/
    reports:
      performance:
        - target/gatling/**/simulation.log
  only:
    - schedules # запуск по расписанию, не на каждый коммит

В GitHub Actions конфигурация аналогична: используем action gatling/gatling-action или кастомный Docker-образ. Важно: не запускайте нагрузочные тесты на каждый коммит — это перегружает pipeline и искажает результаты. Оптимально — по расписанию или перед релизом.

Анализ результатов и типичные находки

Отчёт Gatling позволяет быстро выявить аномалии. Например, если p95 растёт плавно — проблема в масштабировании приложения. Если же при определённом RPS происходит резкий скачок — ищите исчерпание пула соединений или GC. Наши инженеры гарантируют, что после настройки Gatling вы получите чёткий список узких мест с рекомендациями. Экономия от предотвращения одного инцидента может превышать стоимость всей настройки в десятки раз.

Что входит в настройку

Настройка Gatling для вашего проекта включает: разработку сценариев под реальные user flows (на основе access logs или аналитики), конфигурацию фидеров данных, интеграцию в CI/CD pipeline, настройку assertions и алертов при деградации, первый прогон с анализом результатов и рекомендациями. Свяжитесь с нами для аудита вашей инфраструктуры — получите готовый план нагрузочного тестирования. Получите консультацию по настройке нагрузочного тестирования — это поможет избежать простоев и сэкономить бюджет.

Масштаб задачи Срок
1-2 простых сценария, нет CI интеграции 1-2 дня
3-5 сценариев, интеграция в GitLab/GitHub CI 3-5 дней
Сложные stateful сценарии + распределённый запуск 1-2 недели

Стоимость рассчитывается индивидуально после аудита инфраструктуры и требований к тестированию.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139