Саранча остановилась после временного получения ошибки 500

#python #locust

Вопрос:

Когда балансировщик нагрузки перед тестируемым веб-сайтом 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 amp; 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
 

Комментарии:

1. Я видел такое поведение, если у вас есть несколько человек, пытающихся одновременно получить доступ к пользовательскому интерфейсу Locust. Вы единственный, кто пытается просмотреть пользовательский интерфейс, или есть другие?

Ответ №1:

Каждая саранча работает в потоке. Если поток блокируется, он не предпринимает дальнейших действий.

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

Что-то подобное, вероятно, то, что вам нужно, потенциально с попыткой/исключением сделать что-то другое, когда вы получаете исключение тайм-аута http.

Комментарии:

1. Tks, повторит попытку переключения. Просто нужно было обеспечить более высокий тайм-аут в 3 секунды, так как .1 был слишком коротким. Кроме того, я обновил дело, так как заметил 16 ошибок 500 от балансировщика нагрузки во время сбоя. (работает с 20 пользователями). Но даже если 4 пользователя не получили никакой ошибки 500, график RT останавливается, а другие линии остаются горизонтальными.

2. Я буду исследовать больше, так как эта опция для установки тайм-аута в get вместо того, чтобы на уровне пользователя, кажется, действительно имеет значение. До сих пор не возникало проблем с таким коротким таймаутом, как этот, равным 3,0 с. Похоже, вы все-таки нашли обходной путь !

3. Вероятно, в вашей настройке на стороне приложения есть вторая ошибка, из-за которой она не отвечает своевременно. Что-то вроде харикири для uwsgi, чтобы, если приложение перестает отвечать, пользователи получали сообщение об ошибке вместо неопределенного зависания.

Ответ №2:

По моему опыту, проблема, которую вы описываете с помощью диаграмм в пользовательском интерфейсе Locust, не имеет ничего общего с ошибками, с которыми сталкиваются ваши пользователи Locust. Я видел такое поведение, если у вас есть несколько человек, пытающихся одновременно получить доступ к пользовательскому интерфейсу Locust. Locust использует Flask для создания и обслуживания пользовательского интерфейса. Колба сама по себе (по тому, как ее использует Саранча) плохо справляется с несколькими соединениями.

Если человек А начнет использовать пользовательский интерфейс Locust и начнет тест, он увидит статистику и все будет работать нормально, пока человек Б не загрузит пользовательский интерфейс Locust. Затем человек В увидит, что все работает нормально, но у человека А возникнут проблемы, как вы описываете, поскольку тест, по-видимому, застопорился, а графики не обновляются должным образом. В этом состоянии иногда запуск нового теста временно устраняет проблему, в других случаях вам нужно обновить. В любом случае, A и B будут сражаться друг с другом за рабочий пользовательский интерфейс.

Решением в этом случае было бы поместить Locust за обратный прокси-сервер, используя что-то вроде Nginx. Затем Nginx поддерживает единое соединение с Locust, и все пользователи подключаются через Nginx. Пользовательский интерфейс Locust должен затем продолжать работать для всех подключенных пользователей с корректным обновлением статистики и диаграмм.

Комментарии:

1. Привет, спасибо за ответ, но в моем случае это проблема с саранчой : — Я использую саранчу в течение нескольких месяцев и могу видеть это каждый раз, когда происходит сбой балансировщика нагрузки или если серверы перестают отвечать. — Я также столкнулся с проблемой, которую вы описываете, но тогда весь графический интерфейс недоступен. Здесь я один на нем, и график продолжает прогрессировать, просто устойчивые горизонтальные линии для количества запросов и пользователей. Только RT перестает быть нарисованным.