Я провожу нагрузочное тестирование с помощью Locust. Что бы это ни стоило, я также использую Graphite и Grafana для анализа результатов, но я могу создать эту проблему без загрузки или использовать любую из них в своем коде.
По своей простоте проблема может быть воспроизведена со следующим очень простым файлом саранчи:
from locust import HttpLocust, TaskSet, task, between
import locust.events
class Tasks(TaskSet):
@task
def make_request(self):
self.client.get('/')
print('doing thing')
class Locust(HttpLocust):
wait_time = between(1, 3)
task_set = Tasks
def __init__(self):
super(Locust, self).__init__()
locust.events.request_success += self.hook_request_success
def hook_request_success(self, request_type, name,
response_time, response_length):
# This is where I would make a call to send the request's metadata to Graphite
print("sending thing")
Вызывается так:
locust -H <host> -t 10s -c 1000 -r 10 --no-web -f test.py
Как вы можете видеть, spe c is basi c. У меня есть план с одной задачей, и я хочу выполнить один запрос, отправив результат каждого запроса в Graphite. Тем не менее, во время всех моих пробежек я получаю почти в шестьдесят (60) раз больше случаев «отправки вещи», чем «выполнения дела», когда я предполагаю, что они будут точно один в один! Я подтвердил, что функция вызывается с теми же параметрами и представляет один и тот же запрос, просто вызывается много раз для каждого «фактического» запроса, который делает саранча. Я вообще не хочу этого, я хочу отправить запрос только один раз.
Почему это так? Я что-то не так делаю?