Locust 在暂时收到错误 500 后停滞不前
Locust stalled after temporarily getting Error 500
当被测试的 https 网站前面的负载均衡器发生故障转移时,会在几秒钟内生成一些 HTTPError 500,然后 Locust 挂起:
- 响应时间图停止(空图)
- 每秒总请求数变为一条错误的绿色扁平线。
如果我只是停止并开始测试,蝗虫会重新启动并正确监控响应时间。
- 我们可以在“失败”选项卡中看到一些 HTTPError 500
这是一个错误吗?
如何确保 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 应该会继续为所有连接的用户工作,并正确更新统计数据和图表。
当被测试的 https 网站前面的负载均衡器发生故障转移时,会在几秒钟内生成一些 HTTPError 500,然后 Locust 挂起:
- 响应时间图停止(空图)
- 每秒总请求数变为一条错误的绿色扁平线。 如果我只是停止并开始测试,蝗虫会重新启动并正确监控响应时间。
- 我们可以在“失败”选项卡中看到一些 HTTPError 500
这是一个错误吗? 如何确保 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 应该会继续为所有连接的用户工作,并正确更新统计数据和图表。