Locust 在暂时收到错误 500 后停滞不前

Locust stalled after temporarily getting Error 500

当被测试的 https 网站前面的负载均衡器发生故障转移时,会在几秒钟内生成一些 HTTPError 500,然后 Locust 挂起:

这是一个错误吗? 如何确保 Locust 手动或在超时时杀死并重新启动用户?

我尝试定期“RescheduleTaskImmediately”没有帮助。

我的locustfile.py:

#!/usr/bin/env python
import time
import random
from locust import HttpUser, task, between, TaskSet
from locust.exception import InterruptTaskSet, RescheduleTaskImmediately

URL_LIST = [
"/url1",
"/url2",
"/url3",
]

class QuickstartTask(HttpUser):
    wait_time = between(0.1, 0.5)
    connection_timeout = 15.0
    network_timeout = 20.0

    def on_start(self):
        # Required to use the http_proxy & https_proxy
        self.client.trust_env = True
        print("New user started")
        self.client.timeout = 5
        self.client.get("/")
        self.client.get("/favicon.ico")
        self.getcount = 0

    def on_stop(self):
        print("User stopped")

    @task
    def track_and_trace(self):
        url = URL_LIST[random.randrange(0,len(URL_LIST))]
        self.client.get(url, name=url[:50])
        self.getcount += 1
        if self.getcount > 50 and (random.randrange(0,1000) > 990 or self.getcount > 200):
            print(f'Reschedule after {self.getcount} requests.')
            self.client.cookies.clear()
            self.getcount = 0
            raise RescheduleTaskImmediately

每个蝗虫都在一个线程中运行。如果线程被阻塞,它不会采取进一步的行动。

self.client.get(url, name=url[:50], timeout=.1)

您可能需要这样的东西,当您收到 http 超时异常时,可能需要 try/except 来做一些不同的事情。

根据我的经验,您使用 Locust 图表描述的问题 UI 与您的 Locust 用户遇到的错误无关。如果您有多个人试图同时访问 Locust UI,我已经看到了这种行为。 Locust 使用 Flask 创建和提供 UI。 Flask 本身(以 Locust 使用它的方式)不能很好地处理多个连接。

如果 A 开始使用 Locust UI 并开始测试,他们将看到统计数据并且一切正常,直到 B 加载 Locust UI。然后,B 会看到一切正常,但 A 会遇到您描述的问题,测试似乎停滞不前,图表未正确更新。在那种状态下,有时开始一个新的测试会暂时解决它,其他时候你需要刷新。无论哪种方式,A 和 B 都会为工作 UI.

而互相争斗

这种情况下的解决方案是使用诸如 Nginx 之类的东西将 Locust 置于反向代理之后。 Nginx 然后维护与 Locust 的单一连接,所有用户都通过 Nginx 连接。 Locust 的 UI 应该会继续为所有连接的用户工作,并正确更新统计数据和图表。