Определение простыми словами
JMeter — это «толпа в коробке». Вы описываете сценарий пользователя (открыл главную → залогинился → положил товар в корзину), указываете количество одновременных потоков и длительность. Программа гоняет этот сценарий параллельно и показывает, на каком количестве RPS сервер начинает тормозить или падать.
Тесты пишутся в графическом GUI, но для CI и нагрузочных стендов запускаются в headless-режиме с JMX-файлом. Результаты — отчёт HTML с графиками отклика, перцентилями и таблицей ошибок. Полученные цифры сверяют с SLA и метриками Core Web Vitals. Альтернативы — k6, Locust, wrk, Gatling, Yandex Tank.
Сравнение
| Инструмент | Язык сценариев | Сильная сторона | Слабая сторона |
|---|---|---|---|
| Apache JMeter | GUI + JMX (XML) | Богатый плагинами, всё через UI | Тяжёлый, JVM-память |
| k6 | JavaScript | Лёгкий, версионируется в Git | Сложнее протоколы кроме HTTP |
| Locust | Python | Гибкие сценарии, простой DSL | Меньше готовых плагинов |
| wrk | Lua, CLI | Простой стресс-тест за минуту | Только HTTP |
| Gatling | Scala/Kotlin DSL | Высокий throughput, отчёты | Порог входа |
Кейсы использования
- Тест магазина перед чёрной пятницей — 5000 виртуальных пользователей с реалистичным временем «думанья» 3–8 секунд.
- API gateway — проверка лимита запросов, поиск точки деградации (когда p95 превышает 500 мс).
- База данных — JDBC Sampler гоняет SQL-запросы и измеряет время ответа MySQL/Postgres под нагрузкой.
- WebSocket чат — плагин websocket-samplers моделирует тысячи активных подключений.
- Негативный сценарий: запустить JMeter с одного ноутбука против прода в 10 000 потоков — упадёт сам ноутбук, а не сервер. Распределённый стенд (1 master + 3–5 slave-машин) или облачные сервисы вроде BlazeMeter обязательны при больших нагрузках.
Технические детали
# Установка JMeter
wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz
tar xzf apache-jmeter-5.6.3.tgz
cd apache-jmeter-5.6.3/bin
# GUI для разработки сценария (на локальной машине)
./jmeter
# Headless-запуск на нагрузочном стенде
./jmeter -n -t test-plan.jmx
-l result.jtl
-e -o report-html/
-Jthreads=500 -Jrampup=60 -Jduration=300
# Распределённый режим: master + 3 slave
./jmeter -n -t test-plan.jmx
-R slave1.local,slave2.local,slave3.local
-l result.jtl
# Анализ перцентилей из CSV
awk -F',' 'NR>1 {print $2}' result.jtl | sort -n
| awk 'BEGIN{c=0} {a[c++]=$1} END {print "p50=" a[int(c*0.5)], "p95=" a[int(c*0.95)], "p99=" a[int(c*0.99)]}'
🔥 Где это применяется
Частые вопросы
Сколько потоков может выдать одна нода JMeter?
Зависит от тяжести сценария и JVM. Простой HTTP-GET — 1500–3000 потоков с 4 ГБ heap. Сложные тесты с большими телами и парсингом JSON — 300–500. Дальше нужен распределённый стенд.
Чем JMeter лучше k6 и Locust?
Готовые семплеры для JMS, JDBC, FTP, LDAP и десятки плагинов. Если тестируется только HTTP — k6 проще и легче. Под банковскую инфраструктуру JMeter покрывает больше протоколов.
Можно ли тестировать прод?
Технически да, но рискованно. Обычно поднимают staging-копию с теми же ресурсами или гоняют тест в окно минимальной активности с предупреждением команды и канареечным трафиком.