«Сайт работает» — не то же самое, что «сайт выдержит нагрузку». На тестовом домене, где вас посещают три человека в день, всё летает. На реальном трафике, где 50 000 человек одновременно решают задачу, сайт может лечь за 30 секунд.

Нагрузочное тестирование — это имитация реального трафика. Вы искусственно создаёте нагрузку, смотрите, где начинаются проблемы, и исправляете их до того, как они станут дорогими. Это стандартная практика в разработке, но для обычных сайтов про неё часто забывают — и зря.

Кому это нужно

Если вы запускаете рекламу, готовитесь к распродаже, участвуете в маркетплейсе или просто ожидаете роста трафика — нагрузочный тест даст спокойствие и сэкономит деньги. Один час теста может сохранить десятки тысяч рублей рекламного бюджета.

1. Виды нагрузочных тестов

Не существует одного универсального теста. Есть несколько видов, и каждый отвечает на свой вопрос.

  • Smoke test (дымовой). Простая проверка: выдержит ли сайт обычную нагрузку? Несколько виртуальных пользователей, обычная скорость. Цель — убедиться, что базовая конфигурация работает.
  • Load test (нагрузочный). Имитация ожидаемой нагрузки. Тестируем сайт при 100, 500, 1000 пользователях. Ищем, при каком значении появляются проблемы.
  • Stress test (стрессовый). Нагрузка выше ожидаемой. Что произойдёт, если придут в 2–3 раза больше людей? Упадёт ли сайт полностью или начнёт отвечать медленнее?
  • Spike test (пиковый). Резкий скачок нагрузки. Например, вы сделали пост в соцсети и на вас в течение минуты пришли 5 000 человек. Как поведёт себя сайт?
  • Soak test (тест на выносливость). Длительная нагрузка в течение нескольких часов. Проверяет утечки памяти, переполнение логов, деградацию производительности со временем.

Для запуска рекламы минимум — smoke + load. Если ожидаете резкий рост — добавьте spike. Для долгоживущих проектов полезен soak.

2. Инструменты: что выбрать

Все инструменты делятся на три категории: простые CLI-утилиты, скриптовые фреймворки и облачные сервисы.

Простые CLI:

  • Apache Bench (ab). Простая утилита из пакета Apache. Команда ab -n 10000 -c 100 https://site.ru/ отправляет 10 000 запросов с 100 одновременными. Подходит для проверки одного URL.
  • wrk. Быстрее и гибче, чем ab. Поддерживает многопоточность, Lua-скрипты для сложных сценариев.
  • hey. Современная замена ab, написан на Go. Простой синтаксис, приятный вывод.

Скриптовые фреймворки:

  • k6 (Grafana). Современный стандарт для нагрузочного тестирования. Тесты пишутся на JavaScript, поддерживают сценарии пользователей (регистрация → логин → оформление заказа), интегрируются с CI/CD.
  • Locust. Python-фреймворк с веб-интерфейсом. Тесты — на Python, удобно для сложной логики.
  • JMeter. Мощный, но тяжёлый. GUI для создания тестов, XML-описание. Используется в крупных проектах.

Для обычных сайтов я рекомендую k6. Он простой, современный, легко пишутся сценарии. Пример теста:

import http from 'k6/http';
import { sleep, check } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 100 },   // разогрев до 100 юзеров
    { duration: '5m', target: 100 },   // держим 5 минут
    { duration: '2m', target: 500 },   // увеличиваем до 500
    { duration: '5m', target: 500 },   // держим 5 минут
    { duration: '2m', target: 0 },     // охлаждение
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'], // 95% запросов быстрее 500мс
    http_req_failed: ['rate<0.01'],   // меньше 1% ошибок
  },
};

export default function () {
  const res = http.get('https://site.ru/');
  check(res, {
    'status is 200': (r) => r.status === 200,
    'page loads fast': (r) => r.timings.duration < 1000,
  });
  sleep(1);
}

Запускается командой k6 run test.js. Результаты — понятный вывод в терминале с графиками p95, среднего времени ответа и процента ошибок.

3. На что смотреть в результатах

Сам факт «сайт выдержал» — малоинформативен. Что важно:

  • P95 и P99 задержки. Не смотрите на среднее — оно врёт. Если 95% запросов быстрее 300 мс, а 5% — 5 секунд, пользователи почувствуют именно медленные 5%. P99 покажет, как долго ждут самые «несчастливые» 1%.
  • Процент ошибок. Даже 0.5% ошибок при 10 000 запросов — это 50 неудачных обращений. Клиенты видят «ошибку 500» и уходят.
  • RPS (запросов в секунду). Максимальное число запросов, которое сайт держит без деградации. Это ключевой показатель для планирования.
  • Точка отказа. При каком количестве одновременных пользователей сайт начинает «падать»? Это верхняя граница нагрузки, которую вы должны знать.
  • Использование CPU и памяти на сервере. Хороший нагрузочный тест параллельно смотрит на системные метрики. Если CPU упирается в 100% раньше времени — нужно масштабировать.

4. Что обычно ломается под нагрузкой

Из опыта — проблемы при нагрузке предсказуемы. Вот что встречается чаще всего:

  • База данных. Нагрузка на БД растёт быстрее, чем на приложение. Медленные запросы при высокой конкуренции блокируют друг друга. Решение — индексы, кэширование, чтение с реплик.
  • Утечки памяти. Особенно в Python и Node.js. За несколько часов работы процесс «съедает» всю память и падает. Находится долгим soak-тестом.
  • Узкие места в PHP-FPM. Мало воркеров, долгие запросы блокируют пул. Клиенты ждут ответа, потом видят «502 Bad Gateway». Лечится увеличением воркеров или оптимизацией кода.
  • Отсутствие кэша. Каждый запрос идёт в базу и генерирует страницу заново. Под нагрузкой это убивает сервер. Решение — Redis или файловый кэш, CDN для статики.
  • Внешние API. Если сайт обращается к чужому сервису (платежи, карты, доставка), то падает не ваш сервер, а чужой — но у вас всё равно всё встаёт. Нужны таймауты и retry.

5. Когда проводить нагрузочное тестирование

  • Перед запуском рекламы. Обязательно. Особенно если реклама планируется масштабная — Яндекс.Директ на 100 000 ₽ может привести в 10 раз больше трафика, чем сейчас.
  • После крупных изменений. Новый функционал, смена CMS, переезд на другой сервер — тестируйте снова.
  • Перед акциями и распродажами. «Чёрная пятница» и Новый год дают пики в 5–10 раз выше обычных.
  • Раз в квартал. Даже без изменений нагрузка растёт, появляются новые данные, поведение пользователей меняется.
Важное правило: проводите тесты на копии продакшена, а не на живом сайте. Или в нерабочие часы с уведомлением клиентов. Нагрузочный тест сам по себе создаёт нагрузку, которая может уронить сайт.

Нагрузочное тестирование — это не «дополнительная услуга для крупных проектов». Это часть нормального цикла разработки. Стоимость теста — несколько часов работы инженера. Стоимость упавшего сайта в день рекламной кампании — весь рекламный бюджет плюс репутация.

Проверим ваш сайт под нагрузкой

Проведём нагрузочное тестирование, покажем узкие места, дадим рекомендации по оптимизации. От 15 000 ₽.