【问题标题】:Locust stalled after temporarily getting Error 500Locust 在暂时收到错误 500 后停止
【发布时间】:2021-09-22 14:00:10
【问题描述】:

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

  • 响应时间图停止(空图)
  • 每秒的总请求数变成错误的绿色扁平线。 如果我只是停止并开始测试,locust 会重新启动正确监控响应时间。
  • 我们可以在“失败”选项卡中看到一些 HTTPError 500

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

我尝试定期“立即重新安排任务”没有帮助。

我的 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

【问题讨论】:

  • 如果您有多个人试图同时访问 Locust UI,我已经看到了这种行为。您是唯一一个尝试查看 UI 的人还是其他人?

标签: python locust


【解决方案1】:

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

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

这样的东西可能是你需要的,当你得到一个 http 超时异常时,可能会使用 try/except 来做一些不同的事情。

【讨论】:

  • Tks,将重试故障转移。只需要提供 3 秒的更高超时时间,因为 .1 太短了。此外,我确实更新了案例,因为我在故障转移期间注意到来自负载平衡器的 16 错误 500。 (运行 20 个用户)。但即使 4 个用户没有收到任何错误 500,RT 图表也会停止,其他线条保持水平。
  • 我会进行更多调查,因为在 get 中设置超时而不是在用户级别设置超时的选项似乎确实有所作为。到目前为止,设置为 3.0 秒的短超时没有问题。看来您确实找到了解决方法!
  • 在您的应用程序端设置中可能存在第二个错误,即无法及时响应。类似于 uwsgi 的harikiri ,如果应用程序停止响应,用户会收到错误消息而不是无限期挂起。
【解决方案2】:

根据我的经验,您使用 Locust 用户界面上的图表描述的问题与您的 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 的用户界面应继续为所有连接的用户工作,并正确更新统计数据和图表。

【讨论】:

  • 嗨,谢谢你的回答,但在我的情况下,这是一个蝗虫问题:-我用蝗虫几个月了,每次都能看到这种行为,在负载的确切时间平衡器故障转移或服务器停止响应。 - 我也遇到了你描述的问题,但是整个 GUI 都不可用。在这里,我独自一人,图表继续前进,只是请求和用户数量的稳定水平线。只有 RT 停止绘制。
猜你喜欢
  • 2010-11-28
  • 2018-06-30
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
相关资源
最近更新 更多