Как реализовать планирование внутри работающей группы потоков?
Я тестирую определенную "функциональность", которая происходит после входа в систему.
Тестовый пример - 500 пользователей, использующих эту функциональность в течение 5 минут.
Я могу добавить таймер синхронизации после входа в систему, чтобы убедиться, что все 500 потоков вошли в систему, но тогда он выполнит все 500 "функциональных" задач одновременно, а не 5 минут, что приведет к сбою приложения (он думает, что есть DDoS-атака). и выключается).
Прямо сейчас я решаю эту проблему, давая некоторое время на обдумывание после входа в систему, чтобы замедлить вход в систему до стабильной цифры, которую я могу предсказать, а затем запустить "функциональность" на каждом ходу потока, как запланировано:
главный планировщик
+ лог время отклика
+ время думать...
Но это немного нечетко. Есть ли способ "наращивать" задачи, когда они уже запущены?
2 ответа
По умолчанию JMeter выполняет запросы настолько быстро, насколько это возможно, вы можете "ограничить" выполнение до желаемой скорости (запроса в минуту) с помощью таймера постоянной пропускной способности.
Пример плана тестирования будет выглядеть так:
- Группа потоков
- Авторизоваться
- Синхронизирующий таймер
- функциональность
- Таймер с постоянной пропускной способностью
- Авторизоваться
Таймер постоянной пропускной способности следует правилам JMeter Scoping, поэтому вы можете применять его либо к одному сэмплеру, либо к группе сэмплеров.
Я могу думать в двух вариантах.
Первый - два случайных раза. Вы бы использовали диапазон от 0
секунд до 300 - 1
то есть [0-300)
или используя миллис [0-300000)
, Затем спите потоком по этому времени.
Этот подход может быть немного более реалистичным, потому что, например, в определенную секунду данного интервала у вас нет запускаемых потоков, а в другую конкретную секунду у вас 2-3. Это все равно должно быть хорошо сбалансировано в целом, так как вы не будете делать все петиции при запуске.
Второй способ - равномерно запускать потоки. Во время настройки (входа в систему и до запуска потоков) вы можете использовать что-то вроде AtomicInteger, инициализируя его new AtomicInteger(0)
и звонит getAndIncrement()
назначить возможность резьбы, в диапазоне [0-500)
а потом, когда ты запускаешь нитки спать 300.0 * id / 500.0
миллисекунды для выполнения задачи / петиции.