Заметки по JMeter

Заметки

  • JMeter легко масштабируется с использованием remote_hosts (distributed mode) в одной подсети (см. подробнее ниже).
  • На практике можно запустить очень много JMeter нагрузчиков – знаю о инсталяциях с 10 ТЫС. JMeter
  • JMeter использует Java, поэтому требует установленный Java и, как ни странно Microsoft Visual C++ Redistributable (подробнее ниже)
  • Кроссплатформенный (Windows, Linux)
    • Иногда требуется тюнинг TCP параметров стека (напр. в Linux TCP reuse), чтобы JMeter смог создать нужное количество клиентов
  • Версия с GUI/CLI
    • GUI для удобного создания сценария
    • CLI для load теста
Don't run load test using GUI mode !

# CLI пример запуска - jmx файл с конфигом, jtl файл с результирующим для тестирования логом, dashboard папка с HTML отчетом.
jmeter -n -t <test JMX file> -l <test log file> -e -o <Path to output folder>

# Объявление properties в конфиг файле (0 - значение по умолчанию) load_USERS ${__P(load_USERS,0)}

# Так же на входе можно передавать конфигурируемые переменные (properties) - в случае локального запуска передаются через "J", в случае распределенного через "G"
jmeter -Jload_USERS=10 -n -t <test JMX config file> -l <test JTL log file> -e -o <Path to output folder>

jmeter -R "172.31.7.144,172.31.7.253,172.31.7.135" -GCALIBR1_USERS=334 -GRAMP_UP=60 -n -t jmeter_test_config.jmx -l calibr1.jtl -e -o calibr11

You can pass local property via -J command line argument like
jmeter -Jusers=50
If you're running tests in distributed mode you need to substitute it with -G switch where you can provide either a single property or .properties file, in this case global properties will be pushed to remote JMeter servers
jmeter -Gusers=50
  • Запись скриптов возможна как с использованием proxy функционала встроенного в JMeter (JMeter recorder- http proxy перехватывает действия пользователя и представляет в виде команд jmeter), так и расширениями к chrome, например BlazeMeter Chrome Extension.
  • Возможна интеграция JMeter и Selenium для реализации сложных и максимально приближенных к пользователю сценариев (Selenium/WebDriver Support – Chrome Driver Config). При этом в документации JMeter явно указано, что это не браузер.
JMeter is not a browser, it works at protocol level. As far as web-services and remote services are concerned, JMeter looks like a browser (or rather, multiple browsers); however JMeter does not perform all the actions supported by browsers. In particular, JMeter does not execute the Javascript found in HTML pages. Nor does it render the HTML pages as a browser does (it's possible to view the response as HTML etc., but the timings are not included in any samples, and only one sample in one thread is ever displayed at a time).
    • Если исполнение js на стороне клиента не требуется, то возможно не требуется интеграция selenium/phantom с JMeter т.к. действия по “результату” исполнения jmeter может повторить и, например, осуществить загрузку статических страниц (css, js и проч), которые загружались при использовании браузера.
  • Можно использовать разные переменные. К примеру, легко можно в каждый запрос добавить timestamp unix-формата.
${__time()}
will return time in millis 1516540541624
  • Легко использовать пул учетных записей для тестирования, а не одну учетную запись
  • Настройки лучше всего изменять используя только файл user.properties
    • чтобы не путаться, где хранятся кастомизированные настройки
    • чтобы исключить проблему (баг), когда при использовании опции -q превалирующими настройками все равно считаются user.properties
В случае наличия заданных параметров в системном файле и отсутствия в пользовательском будут использованы пользовательские.

 

PERFORMANCE tuning
1) Some suggestions on reducing resource usage.
2) Some other suggestions
- Disable firewall/antivirus
Antivirus should be stopped during a Load Test as it can drastically impact timings leading to wrong results.
- Use CLI mode
jmeter -n -t test.jmx
- Use as few Listeners as possible
- Don't use "View Results Tree" or "View Results in Table" listeners during the load test
- Rather than using lots of similar samplers, use the same sampler in a loop, and use variables (CSV Data Set) to vary the sample. [The Include Controller does not help here, as it adds all the test elements in the file to the test plan.]
- Don't use functional mode
- Use CSV output rather than XML
- Only save the data that you need
- Use as few Assertions as possible
- Use the most performing scripting language (see JSR223 section)

Heap Size problem

Даже если сделать все что написано ниже, это позволит выйти на уровень загрузки 30 МБ файла на трех JMeter на сервере с 30GB RAM (27 выделено для JMeter) с общим количеством клиентов в 1000 (т.е. 10GB на ноду сервера JMeter).

  • Следуем вышестоящим рекомендациям – отключение всего ненужного
  • Кастомизируем heap size в соответствии с количеством available RAM в системе
  • Кастомизация user.properties явным указанием собираемых данных (отключение сбор избыточных данных по результату тестирования) –  не поможет при больших файлах, загружаемых одновременно в несколько потоков. Судя по всему несмотря на наличие данных опций jmeter необходимо полностью выгрузить файл из сети в RAM перед высвобождением места.

CFG
set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m # default
set HEAP=-Xms25g -Xmx25g -XX:MaxMetaspaceSize=256m # now

Increase the Java Heap size
By default JMeter runs with a heap of 1 GB, this might not be enough for your test and depends on your test plan and number of threads you want to run

Example of error
Thread Group - TestUpdate 1-12,5,main]. See log file for details.
Uncaught Exception java.lang.OutOfMemoryError: Java heap space in thread Thread

User.properties (jmeter.properties лучше не модифицировать!)
You can vastly improve the throughput by reducing the amount of data being written into the JTL files by editing the jmeter.properties file.
For example, jmeter.save.saveservice.samplerData=true can really hurt JMeter performances because it writes down all the responses data. Avoid saving anything related to response data, response headers or assertions data unless you absolutely need them. They can consume a great amount of memory.

jmeter.properties
#
# THIS FILE SHOULD NOT BE MODIFIED
#
# This avoids having to re-apply the modifications when upgrading JMeter
# Instead only user.properties should be modified:
# 1/ copy the property you want to modify to user.properties from jmeter.properties
# 2/ Change its value there

Remote hosts (distributed mode)

Jmeter легко масштабируется с использованием remote_hosts (distributed mode) в одной подсети (см. подробнее ниже). Тестирование на всех нагрузчиках можно запустить синхронно (почти – почему – ниже) с контроллера (Run -> Remote Start All).

Синхронность запуска тестирования между разными серверами JMeter совсем не идеальна (не такая, как например, при использовании synstart) -  нужно быть аккуратным, например, с использованием ramp up в единицу, в реальности один сервер JMeter может сгенерировать всю нагрузку, а остальные будут простаивать, пока данные сервер перестанет эту нагрузку генерировать

Рекомендации по запуску и конфигурации.

  1. один сегмент сети
  2. отключение firewall/antivirus на всех нодах (справедливо и для стандартного тестирования)
  3. модификация параметров запуска – SSL обязательно, указание хостов, указание нагрузки (она не распределяется между нодами, а перемножается)
    • либо через файл конфигурации
    • либо через параметры CLI
JMeter does not distribute the load between servers, each runs the full test plan. So if you set 1000 Threads and have 6 JMeter server, you end up injecting 6000 Threads.
cd C:\apache-jmeter-5.4.1\bin
.\jmeter-server.bat
.\jmeter-server.bat

user.properties file
server.rmi.ssl.disable=true # DISABLE SSL for remote-tests
remote_hosts=172.31.7.147,172.31.7.253 # CHANGE for remote-tests (не требуется при указании хостов как параметров в CLI)
jmeter-ctrl - отдельный файл bat, в котором указаны параметры heap size по умолчанию для возможности запуска на той же машине, на которой запущен сервер JMeter с увеличенными настройками heap size (иначе утилите не удается аллоцировать большое количество памяти т.к. она уже аллоцирована сервером JMeter).
vi .\jmeter-ctrl
set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m # default

Remote hosts обязательно указывать через скобки - спасибо, «супер» документация JMeter!!!
.\jmeter-ctrl -R "172.31.7.147,172.31.7.253,172.31.7.135" 


Полный запуск с разными параметрами (передаются через "G").
.\jmeter-ctrl -R "172.31.7.147,172.31.7.253,172.31.7.135" -GCALIBR_USERS=334 -GRAMP_UP=60 -n -t jmeter_test_config.jmx -l logs\calibr_30MB.jtl -e -o reports\calibr_30MB

 

Results

Используя рекомендации выше можно достигнуть:

  1. 2000 threads/users за три секунды при настроенном ramp up (базовая страница GET; проверял на трех нагрузчиках )
  2. Советы по кастомизации, которые позволят “легко” достигнуть 5000 пользователей (threads) на стандартной машине.
NDLR
Following those recommendations you can reach easily up to 5000 threads on a standard basic machine, 10000 threads on a m3.xlarge …

 

Mandatory test elements
    • Collaborate users – user count (threads), ramp-up, loop, scheduler (start/end test time)
    • Samplers (HTTP request) – server portocol, server fqdn/ip
    • User defined variables – username/password/id/etc
    • HTTP header manager – token, content type

 

Additional test elements
    • random variable – создание переменных, которые будут рандомизироваться с range рандомизации
    • sleep timer – таймер между запросами (эмуляция thinking), эмуляция не-совсем одновременного подключения
    • extractor (regexp) – извлечение данных из ответа
      • JSON extractor – позволяет извлечь данные из json ответа сервера и использовать их, например, как переменные для последующих запросов (так и использовал). Примеры хорошо описаны тут.
- Name "JSON Extract last link"
- "MAIN SAMPLE ONLY"
- NAMES OF CREATED VARIABLES: "LAST_LINK"
- JSON Path expression: $.${SOME_KEY}[-1].link # извлекаем только последний элемент
или
- JSON Path expression: $.${SOME_KEY}[*].link # извлекаем все элементы массива
    • assertion – проверка результата

 

Анализ результата

Reports (Listeners) – получение результата в виде метрик, мне достаточно представленных ниже + HTML report, но вообще видов listeners очень много:

    • aggregate (graph) – среднее и медианное время, ошибки и проч
    • results tree – подробные логи каждой транзакции тестирования

Метрики, получаемые из listeners. Подробно описание метрик можно прочитать тут:

    • 1 – все хорошо, 0.5 – юзер терпит, 0 – все плохо (высокая задержка или ошибки). Формула расчета справедлива – все запросы, которые satisfied идут в плюс в карму; tolerating – 0.5; frustrated вообще не идут.

{\displaystyle \mathrm {Apdex} _{\mathrm {t} }={\frac {\mathrm {SatisfiedCount} +({\mathrm {ToleratingCount} }*{0.5})+(\mathrm {FrustratedCount} *0)}{\mathrm {TotalSamples} }}}

The Apdex method converts many measurements into one number on a uniform scale of 0 to 1 (0 = no users satisfied, 1 = all users satisfied).
The formula is equivalent to a weighted average, where a satisfied user is given a score of 1, a tolerating user is given a score of 0.5, and a frustrated user is given a score of 0.

Рассчитывается в default config для HTML отчетов JMeter (подробнее как их включить ниже в отдельном разделе). Отчет легко получить двумя способами – при запуске теста и на основе логов summary из csv файла (в примере ниже только этот способ рассмотрен, хотя первый удобнее).

Критерии оценки могут быть:

    1. Использование Default JMeter или Industry practice
    2. Использование требований к продукту, но если они противоречат п1, то хорошо, если они имеют обоснование этого
    3. Использование 80 или 90% percentile для системы, работающей “as expected”, как источника получения apdex_satisfied_threshold и четырехкратное увеличение этого значения для apdex_tolerated_threshold

Подробнее о Default JMeter thresholds

Причем критерии расчета довольно жесткие – задержка ответа до 1.5 сек (раньше в 2016 было 6.5):

apdex_satisfied_threshold Sets the satisfaction threshold for the APDEX calculation (in ms).
Default: 500

apdex_tolerated_threshold Sets the tolerance threshold for the APDEX calculation (in ms).
Default: 1500

Эти пороговые значения можно кастомизировать для отдельных транзакций или для всех. Например, можно использовать классические требования (0.1 – 1 – 10 секунд) из Excerpt from Chapter 5 in my book Usability Engineering, from 1993. (подробнее ниже)

Generation after load test
Use the following command:
jmeter -n -t <test JMX file> -l <test log file> -e -o <Path to output folder>

Generation from an existing sample CSV log file
Use the following command:
jmeter -g <log file> -o <Path to output folder>

APDEX is explained here To compute it JMeter needs 2 values: - Satisfied count - Tolerating count Satisfied count is the Number of requests for which response time is lower than "Toleration threshold". Tolerating count is the Number of requests for which response time is higher than Toleration threshold but lower than "Frustration threshold". So JMeter let's you customize those 2 values as it depends on your SLR/SLA.

Отчет по apdex и в целом HTML-report можно кастомизировать, изменяя user.properties:

    • Можно для определенных транзакций сделать определенный порог для рачета apdex.
    • Можно исключить из оценки apdex (полностью из отчета) какие-то вещи, используя фильтры. Или точнее – добавить только то, что мы хотим, чтобы оно было в отчете. Главное при этом учитывать, если в результате работы фильтров в выборке не будет ничего – при генерации отчета сгенерируется ошибка Error generating the report: java.lang.NullPointerException.
For example, if the Apdex threshold is 1 second, the tolerable upper threshold for the application response time is 4 seconds (4 x 1 second).
Frustrated: The application response time is greater than 4 times of the Apdex threshold.

# GLOBAL
# Sets the satisfaction threshold for the APDEX calculation (in milliseconds).
    #jmeter.reportgenerator.apdex_satisfied_threshold=500 # default
    #jmeter.reportgenerator.apdex_satisfied_threshold=1000 # modified
# Sets the tolerance threshold for the APDEX calculation (in milliseconds).
    #jmeter.reportgenerator.apdex_tolerated_threshold=1500 # default
    #jmeter.reportgenerator.apdex_satisfied_threshold=10000 # modified
# Sets the satisfaction threshold for the APDEX calculation (in milliseconds).

# PER TRANSACTION
A new property would be introduced :
jmeter.reportgenerator.apdex_per_transaction=\
sample1\:<satisfied>|tolerated\
sample2\:<satisfied>|tolerated

# REPORT ONLY FOR FILTERED ITEMS
# CALIBR jmeter.reportgenerator.sample_filter=
# DEFAULT jmeter.reportgenerator.sample_filter=(.*(login|logout|update).*)
# DOWNLOAD jmeter.reportgenerator.sample_filter=(.*(download).*)
    • Average (обычно для анализа результатов лучше использовать перцентиль percentile line 90-95-99, но для отчетов average) – The average time taken (in milliseconds) to execute the requests under a given label.
      Average = Total time taken by all samples /#samples
    • 90% Line – The Apache JMeter manual describes 90% line as-   “90% of the samples took no more than this time”. It is actually the 90 percentile of the response times of the samples
    • Min – The minimum time (in milliseconds) taken by the sample
    • Max – The maximum time (in milliseconds) taken by the sample
    • Error % – Percentage of errors in the samples
    • KB/sec ((нигде не написано, но это суммарная скорость всех thread, не средняя для всех!)) – The metric KB/sec is nothing but the throughput measured in terms of bytes.
Как СГЕНЕРИРОВАТЬ HTML report

Написано тут, основное действие – копия properties в пользовательские. Остальное (или удаление пользовательского файла) не требуется при генерации репорта после каждого тестирования – см. в CLI пример запуска.

1.Add 'Summary Report', 'Simple Data Writer' from Listeners.
2.Set location to generated csv
3.open reportgenerator.properties from "D:\apache-jmeter-3.0\bin\" copy all content from it
4.Open user.properties from same bin folder
5.Append all from reportgenerator.properties to user.properties and save
6.Now run the your Test script
7.open cmd and enter
jmeter -g D:\Report\TC001_Result.csv -o C:Report\ReportD
8. Go to C:Report\ReportD and open index.html and you can check your test result

 

ERRORS

Фиксировал ошибку, когда фильтр jmeter.reportgenerator.sample_filter исключал все с страницы из выборки.

Error generating the report: java.lang.NullPointerException
      ... end of run

При попытке запуска можно отловить разные ошибки являющиеся следствием отсутствия Java или даже Microsoft Visual C++ Redistributable.

jmeter wont run !Not able to find Java executable or version. Please check your Java installation"

echo $Env:Path
java -jar ApacheJMeter.jar

PS C:\apache-jmeter-5.4.1\bin> java
Error: loading: C:\Program Files\Java\jre1.8.0_281\bin\vcruntime140.dll
Error: loading: C:\Program Files\Java\jre1.8.0_281\bin\server\jvm.dll

JMeter оказывается может использовать SWAP через java и из-за этого использования может сервер не запускаться, при недостатке/отсутствии SWAP.

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000140000000, 28991029248, 0) failed; error='╘р
щы яюфърўъш ёыш°ъюь ьры фы  чртхЁ°хэш  юяхЁрЎшш' (DOS error/errno=1455)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 28991029248 bytes for Failed to commit area from 0x0000000140000000 to 0
x0000000800000000 of length 28991029248.
# An error report file with more information is saved as:
# C:\apache-jmeter-5.4.1\bin\hs_err_pid3980.log
errorlevel=1

 

Leave a Reply