Самый точный RPS для повышающейся нагрузки в условиях изменяющегося времени отклика получил только с
Constant Throughput Timer с настройкой, что он действует только на один поток =
this thread only. Его простота в том, что в нем нет обратной связи, он не корректирует количество потоков в зависимости от времени отклика. Он просто использует все. Поэтому одинаково ровно работает как в начале теста, пока система быстрая, так и в конце, когда она зависает.
Он может работать в режиме обратной связи
all active threads in current thread group (shared) - на все потоки. В этом случае его работа зависит от последнего выполнения сценария:
as above, but each thread is delayed based on
when any thread in the group last ran
И такой режим работы удобен для стабильной нагрузки. Только в стабильной нагрузке мы ожидаем, что и в начале и в конце теста длительность ответов будет одинаковой.
Поэтому таймер с обратной связью
Throughput Shaping Timer я бы рекомендовал для тестов со стабильной нагрузкой. Или для систем со стабильным временем отклика. Или для тестов где четко выставлен Timeout на ожидание ответа и на подключение и таймаут маленький. Иначе такой таймер будет отставать, запаздывать, корректироваться на высоких ступенях нагрузки. И это нормально.
А для нагрузочных тестов (с растущей нагрузкой) простое и стабильное решение -
Constant Throughput Timer в режиме
this thread only. И это проверял.
Дополнительный способ выровнять нагрузку - использовать таймер и на TPS и на RPS, вот тут так попробовал с двумя Constant Throughput Timer:
https://t.me/qa_load/36726Это как нагрузка + trottle в Gatling - сразу и TPS и RPS контроллируем. Только в Gatling у trottle приоритет над профилем нагрузки, он задает и длительность всего теста.
А в JMeter если использовать два таймера, то приоритет срабатывает проще - приоритет лишь на интенсивность, а длительность теста таймером не контролируется.
Например есть два таймера
1) Таймер на все запросы внутри Thread Group - он для RPS пусть 0.1 RPS - это как гибкий Timeout в 10 сек на ожидание ответа, 0.2 RPS будет как таймаут в 5 сек.
2) Таймер внутри первого Flow Control Action для контроля TPS, для этого Flow Control у него больший приоритет, он переопределяет собой первый частый таймер.
Думаю, что такое же можно сделать с двумя
Throughput Shaping Timer и получится гладкая нагрузка, при времени отклика в пределах заданного в таймере RPS шага.
Способ с двумя таймерами тоже имеет ограничения. Его не получится применять если в сценарии переменное количество запросов из-за циклов, условий и вероятностей. Но если RPS стабильный в одной итерации, то способ дает отличный результат.
Недостаток - больший шаг нагрузки для TPS и большее количество потоков. Пусть задано 0.2 RPS (как шаг в 5 сек между запросами), а всего в сценарии 50 запросов. Получается, что даже если запросы не зависнут на весь сценарий нужно будет 250 сек минимум. И надо задать шаг нагрузки в таймере TPS как 1/250 или 60/250 сценариев в минуту. При таком малом значении может понадобится много потоков. Если нужно просто сделать 1 TPS уже надо 250 потоков, а если нужно всего 4 TPS - то 1000 потоков. Иногда это не проблема. И нагрузка получается гладкая.