«Сайт работает» — не то же самое, что «сайт выдержит нагрузку». На тестовом домене, где вас посещают три человека в день, всё летает. На реальном трафике, где 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 ₽.