#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 перестает быть нарисованным.