Locust 为什么蝗虫在一段时间后不发送请求?我怎样才能解决它?

Locust 为什么蝗虫在一段时间后不发送请求?我怎样才能解决它?,locust,Locust,我在试着测试性能。但我注意到,一段时间后没有提出新的请求,只是每隔一段时间打印临时结果报告,请求的数量冻结,直到蝗虫到达时间限制时停止 部分日志: Name # reqs # fails | Avg Min Max Median | req/s failures/s ------------------------------------

我在试着测试性能。但我注意到,一段时间后没有提出新的请求,只是每隔一段时间打印临时结果报告,请求的数量冻结,直到蝗虫到达时间限制时停止

部分日志:

 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /eaog/CreateSess                                            691     0(0.00%)  |     790     250    4406     590  |   13.20    0.00
 POST /eaog/ReceiveInsRsp                                         691     0(0.00%)  |     557       0    2843     390  |   12.90    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                      1382     0(0.00%)  |     674       0    4406     520  |   26.10    0.00

 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /eaog/CreateSess                                            691     0(0.00%)  |     790     250    4406     590  |   13.20    0.00
 POST /eaog/ReceiveInsRsp                                         691     0(0.00%)  |     557       0    2843     390  |   12.90    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                      1382     0(0.00%)  |     674       0    4406     520  |   26.10    0.00

 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /eaog/CreateSess                                            691     0(0.00%)  |     790     250    4406     590  |   13.20    0.00
 POST /eaog/ReceiveInsRsp                                         691     0(0.00%)  |     557       0    2843     390  |   12.90    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                      1382     0(0.00%)  |     674       0    4406     520  |   26.10    0.00

 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /eaog/CreateSess                                            691     0(0.00%)  |     790     250    4406     590  |   13.20    0.00
 POST /eaog/ReceiveInsRsp                                         691     0(0.00%)  |     557       0    2843     390  |   12.90    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                      1382     0(0.00%)  |     674       0    4406     520  |   26.10    0.00

 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /eaog/CreateSess                                            691     0(0.00%)  |     790     250    4406     590  |   13.20    0.00
 POST /eaog/ReceiveInsRsp                                         691     0(0.00%)  |     557       0    2843     390  |   12.90    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                      1382     0(0.00%)  |     674       0    4406     520  |   26.10    0.00

 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /eaog/CreateSess                                            691     0(0.00%)  |     790     250    4406     590  |   13.20    0.00
 POST /eaog/ReceiveInsRsp                                         691     0(0.00%)  |     557       0    2843     390  |   12.90    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                      1382     0(0.00%)  |     674       0    4406     520  |   26.10    0.00

[2020-10-09 20:35:13,127] DESKTOP-AF8SR9S/INFO/locust.main: Time limit reached. Stopping Locust.
[2020-10-09 20:35:13,127] DESKTOP-AF8SR9S/INFO/locust.runners: Stopping 20 users
以下是代码的一部分: 类TaskbotTaskSet(任务集):

环境:

  • python的版本:python 3.7.6(默认,2020年1月8日,20:23:39)[MSC v.1916 64位(AMD64)]::win32上的Anaconda,Inc
  • 蝗虫版本:蝗虫1.2.3
  • 硬件:英特尔酷睿i7-8700@3.2GHz,内存:16GB

  • 非常感谢您提供的任何帮助

    不确定您正在测试的服务器/api,但是self.client.post(api_url['ReceiveInsRsp'])是否可能会等到有东西要接收?您可以覆盖请求超时(检查
    请求
    文档)以强制执行错误,以检查是否存在这种情况。

    我必须承认我不熟悉Python。。。这些天,我甚至阅读了蝗虫的源代码,试图找出它。最后,我发现当使用Queue存储数据时,如果Queue.get()中根本没有数据,程序就会被卡住,并且不会引发异常。因此,使用队列时请小心,这可能会给您带来麻烦。

    如果您重复测试,是否每次停止前都会到达大致相同的点?是否有任何相关的日志行可以指出发生了什么,或者在代码停止时它在代码中的位置?如果没有,你可以加一些。运行蝗虫时使用的命令是什么?每次我重复测试时,当蝗虫冻结时,请求的数量是不同的。我确实在发送请求之前和接收响应之后放置了日志行,并尝试对它们进行计数。我发现,当我将客户端数量设置为10时,如果没有冻结,body_计数比response_计数多10,但是如果冻结,body_计数会相同。我使用的命令行:hocust-f hocust_taskbot.py--host=[host]--headless-u 10-r 10-t 5如果用户数量较少,它的工作时间会更长吗?您是否也可以尝试使用单个请求体之类的东西来简化事情,并确保代码中没有其他可能导致问题的内容?另外,如果您尝试只获取响应,您正在测试的系统是否工作?也许可以尝试将其设置为SequentialTaskSet,以确保在响应之前首先发送请求。我尝试将超时设置为20,但在冻结时未捕获异常。我还使用ThreadPoolExecutor编写了一个脚本,我也使用了请求,但它工作得很好测试中的变量q是什么?q.get()是否可能被阻塞?变量q是记录sid的队列,在请求api_url['CreateSES']时添加到队列中,在请求api_url['ReceiveRsp']时弹出。我更改了脚本以继承SequentialTaskSet,以确保q.get()之前的q.push(),但它也失败了,一段时间后仍然冻结。请尝试在任务中添加一些print语句,以查看是否可以缩小它卡住的确切位置(从post之前和之后开始)
    def on_start(self):
        get_flow_id()
    
    def on_stop(self):
        print("body_count: {}; response_count: {}".format(body_count, response_count))
    
    @task
    def create_sess(self):
        sid = str(uuid.uuid1())
        body = {"taskId": {
            "bid": bid,
            "sid": sid},
            "appId": "BCCS"}
        body = json.dumps(body).encode('utf-8')
    
        global body_count
        body_count += 1
    
        print("post create_sess body: {}".format(body))
        with self.client.post(api_url['CreateSess'], data=body, headers=headers, catch_response=True) as res:
            global response_count
            response_count += 1
    
            print(res.text)
            if res.status_code != 200:
                res.failure('request failed: %s ' % res.text)
            else:
                msg = json.loads(res.text)
                if msg['code'] == 0:
                    q.put(sid)
                    res.success()
                else:
                    res.failure('request returned with error: %s ' % res.text)
    
    @task
    def receive_rsp(self):
        sid = q.get()
        flow_id = random.choice(flow_ls)
        body = {
            "taskId": {
                "bid": bid,
                "sid": sid,
                "flow_id": flow_id,
                "ins_id": "t-1",
                "res": "test_result"},
            "appId": "BCCS"
        }
        body = json.dumps(body).encode('utf-8')
    
        global body_count
        body_count += 1
    
        print("post receive body: {}".format(body))
        with self.client.post(api_url['ReceiveInsRsp'], data=body, headers=headers, catch_response=True) as res:
            global response_count
            response_count += 1
            q2delete.put(sid)
            print(res.text)
            if res.status_code != 200:
                res.failure('request failed: %s' % res.text)
            else:
                msg = json.loads(res.text)
                if msg['code'] == 0:
                    res.success()
                else:
                    res.failure('request returned with error: %s' % res.text)