Как интерпретировать вывод LocustIO / моделировать короткие посещения пользователей

Мне нравится Locust, но у меня проблемы с интерпретацией результатов.

например мой вариант использования - у меня есть сайт петиций. Я ожидаю, что 10 000 человек подпишут петицию в течение 12 часов.

Я написал файл саранчи, который имитирует поведение пользователя:

  1. Некоторые пользователи загружают, но не подписывают петицию
  2. Некоторые пользователи загружают и отправляют неверные данные
  3. Некоторые пользователи (надеюсь) успешно отправляют.

В реальной жизни пользователь теперь уходит (потому что петиция - это API, а не основной веб-сайт).

Locust показывает мне такие вещи, как:

  • при 50 одновременных пользователях среднее время составляет 11 с.
  • при 100 одновременных пользователях среднее время составляет 20 с.

Но поскольку один «Саранча» просто повторяет задачи снова и снова, это не совсем похоже на одного пользователя. Если я настрою его на группу из 1 пользователя, то это все равно будет представлять множество реальных пользователей в течение определенного периода времени; например за 1 минуту он может выполнить задачу 5 раз: это будет 5 пользователей.

Есть ли способ интерпретировать данные («это означает, что мы можем обрабатывать N человек в час») или каким-то образом я могу увидеть, сколько «задач» выполняется в секунду или минуту и ​​т. Д. (Т.е. саранча дает мне запросов в секунду, но не задач)


person artfulrobot    schedule 20.11.2019    source источник
comment
›Но поскольку один Locust просто повторяет задачи снова и снова, это не совсем похоже на одного пользователя. ... Какая разница в вашем случае? Новая итерация задачи почти такая же, как приход нового пользователя (за исключением того, что он будет повторно использовать http-соединение)   -  person Cyberwiz    schedule 28.11.2019
comment
@Cyberwiz конечно, но метрика, которую я ищу, - это задачи выполнены. Если один пользователь выполнил одну задачу и вышел, то количество пользователей будет равно количеству задач. Я не говорю, что это должно работать таким образом, я просто говорю, что если бы это было так, я бы смог увидеть нужную мне метрику.   -  person artfulrobot    schedule 28.11.2019
comment
Ok. Задачи (к сожалению) действительно не существуют на этом уровне в саранче. Если хотите, вы можете регистрировать свои собственные поддельные образцы и использовать их в качестве счетчика задач. Примерно так: from locust.events import request_success request_success.fire (request_type = task, name = completed, response_time = None, response_length = 0) (но это приведет к загрязнению вашего счетчика rps)   -  person Cyberwiz    schedule 28.11.2019
comment
@Cyberwiz да, верно, я подумал об этом, но не мог понять, как добавить его, не добавляя фактический другой HTTP-запрос - если у вас есть время, чтобы объяснить это в ответе, я бы поставил ему большую зеленую галочку ! Меня не волнует RPS, это бессмысленно в данном контексте.   -  person artfulrobot    schedule 28.11.2019


Ответы (2)


Задачи на самом деле не существуют на уровне регистрации в саранче.

Если хотите, вы можете регистрировать свои собственные поддельные образцы и использовать их в качестве счетчика задач. У этого есть неприятный побочный эффект - завышение частоты запросов, но это не должно влиять на такие вещи, как среднее время ответа.

Нравится:

from locust.events import request_success 

...

      @task(1)
      def mytask(self):
          # do your normal requests
          request_success.fire(request_type="task", name="completed", response_time=None, response_length=0)
person Cyberwiz    schedule 28.11.2019
comment
Блестяще! Он работает, дает мне четкое представление и, как вы говорите, не влияет на среднее время отклика. Это здорово, так как теперь я снова могу использовать распределенные локусы. Спасибо ???? - person artfulrobot; 28.11.2019

Вот хакерский способ, который у меня где-то есть. Я не доволен этим и хотел бы услышать другие ответы.

Создайте переменные класса в моем классе HttpLocust (WebsiteUser):

WebsiteUser.successfulTasks = 0

Затем в наборе задач UserBehaviour:


      @task(1)
      def theTaskThatIsConsideredSuccessful(self):
          WebsiteUser.successfulTasks += 1
          # ...do the work...

      # This runs once regardless how many 'locusts'/users hatch
      def setup(self):
          WebsiteUser.start_time = time.time();
          WebsiteUser.successfulTasks = 0

     # This runs for every user when test is stopped.
     # I could not find another method that did this (tried various combos)
     # It doesn't matter much, you just get N copies of the result!
     def on_stop(self):
          took = time.time() - WebsiteUser.start_time
          total = WebsiteUser.successfulTasks
          avg = took/total
          hr = 60*60/avg
          print("{} successful\nAverage: {}s/success\n{} successful signatures per hour".format(total, avg, hr)

Затем установите ноль wait_time и запускайте, пока он не установится (или не возникнут отказы), а затем остановите тест, нажав кнопку остановки в веб-интерфейсе.

Выход похож на

188 successful
0.2738157498075607s/success
13147.527132862522 successful signatures per hour

Таким образом, я думаю, что это дает мне максимально возможную пропускную способность, с которой может справиться сервер (определяется изменением количества пользователей, заштрихованных до появления сбоев или до тех пор, пока среднее время отклика не станет невыносимым).

Очевидно, у реальных пользователей бывают паузы, но это затрудняет проверку максимальных значений.

Недостатки

  • Невозможно использовать распределенные экземпляры Locust
  • Неряшливый; также не может выполнить «сброс» - необходимо выйти из процесса и перезапустить его для следующего теста.
person artfulrobot    schedule 21.11.2019