Ядро
Нагрузочное тестирование с JMeter
perfscale запускает ваши существующие тест-планы JMeter (.jmx) в
headless-режиме и сводит результаты в тот же поток логов в реальном времени
и k6-совместимый формат сводки, что и все остальные движки. Ничего
переписывать не нужно: возьмите уже имеющийся план, укажите на него
perfscale и получите живой вывод плюс машиночитаемую сводку, которую можно
сравнивать с прогонами k6, locust и нативного движка.
perfscale run --jmeter plan.jmx
Предварительные требования
На машине, где выполняется тест, должна быть установлена JMeter — perfscale оборачивает её, а не встраивает:
jmeter --version # must be on PATH (requires a JRE)
Если бинарный файл не найден, запуск быстро завершается с ошибкой
jmeter not found in PATH — install from https://jmeter.apache.org/download_jmeter.cgi (requires a JRE).
На агентах PerfScale Cloud dev-образ docker уже содержит JRE с
JMeter 5.6.3.
Как проходит прогон
perfscale запускает план в non-GUI-режиме и стримит всё в реальном времени:
jmeter -n -t <plan.jmx>
- JMeter полностью определяет форму нагрузки. Thread groups, ramp-up,
таймеры и пропускная способность — всё берётся из плана. perfscale не
передаёт никаких
-J-свойств, а конфигурация запуска perfscale (vus,duration,stages:) не применяется — план и есть конфигурация. - Живой вывод. Собственные stdout/stderr JMeter стримятся во время прогона, так же как вывод k6 или locust.
- Код выхода. JMeter завершается с ненулевым кодом при ошибках плана или запуска; падения сэмплов внутри плана не меняют код выхода, если сам план на них не реагирует. В CI код выхода — это ваш гейт здоровья плана.
Транслированная сводка
После завершения процесса perfscale захватывает финальную консольную
строку JMeter
(summary = N in HH:MM:SS = R/s Avg: .. Min: .. Max: .. Err: .. (E%)) и
транслирует её в k6-совместимый блок сводки, в котором отчитывается каждый
движок:
http_req_duration......: avg=4.00ms min=3.00ms max=72.00ms
http_req_failed........: 0.00%
http_reqs..............: 100 109.2/s
Без перцентилей. Консольная сводка их не содержит, поэтому у
http_req_duration есть только avg/min/max. Если нужны p95/p99,
используйте собственные средства отчётности JMeter (HTML-отчёт или Backend
Listener) параллельно с прогоном — см. Ограничения.
Параметризация планов
Поскольку -J-свойства извне не передаются, параметризуйте сам план с
помощью property-функций JMeter и значений по умолчанию:
<stringProp name="ThreadGroup.num_threads">${__P(vus,5)}</stringProp>
<stringProp name="LoopController.loops">${__P(loops,20)}</stringProp>
<stringProp name="HTTPSampler.domain">${__P(host,127.0.0.1)}</stringProp>
<stringProp name="HTTPSampler.port">${__P(port,8080)}</stringProp>
Значения по умолчанию позволяют запускать план как есть; чтобы менять
форму нагрузки, оберните вызов jmeter в скрипт, передающий
-Jvus=50 -Jloops=100, или держите несколько тонких вариантов плана под
разные профили.
Запуск на агенте (PerfScale Cloud)
Платформу обслуживает тот же раннер: тест типа JMeter хранит XML плана,
control plane отправляет его на агент, и агент выполняет его через
POST /api/v1/run/jmeter — стримя лог в реальном времени и помещая
транслированную сводку в тот же дашборд и тот же конвейер метрик, что и
прогоны k6.
Ограничения
- Без перцентилей в сводке (только avg/min/max) — консольная сводка JMeter их не содержит.
- Нет гейтов
std/thresholds@v1для прогонов JMeter — гейтом в CI служит код выхода. - Файлы результатов
.jtlне разбираются (парсинг пропускной способности из.jtl— план на будущее). - Без внешней параметризации — конфигурация perfscale и
-J-свойства не применяются; формой нагрузки управляет план.
Сводное сравнение компромиссов по движкам см. в справочнике раннеров.