#python #flask #locust
#python #flask #locust
Вопрос:
Я создал веб-сервис, используя Flask поверх uWSGI. Тестирование Locust генерирует много сбоев, которые, возможно, связаны с тем, что ответы довольно большие. Как мне установить время ожидания для каждого ответа, прежде чем он завершится сбоем. Мои ошибки разнообразны, но это более крупные ответы, которые терпят неудачу.
7 GET /api/read/maa?length=0 HTTPError('500 Server Error: INTERNAL SERVER ERROR for url: http://iecdalpptalpp01.astrazeneca.net:5000/api/read/maa?length=0')
73 GET /api/read/maa?length=0 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
7 GET /api/read/maa?length=1 HTTPError('500 Server Error: INTERNAL SERVER ERROR for url: http://iecdalpptalpp01.astrazeneca.net:5000/api/read/maa?length=1')
53 GET /api/read/maa?length=1 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
3 GET /api/read/maa?length=2 HTTPError('500 Server Error: INTERNAL SERVER ERROR for url: http://iecdalpptalpp01.astrazeneca.net:5000/api/read/maa?length=2')
36 GET /api/read/maa?length=2 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
1 GET /api/read/maa?length=3 HTTPError('500 Server Error: INTERNAL SERVER ERROR for url: http://iecdalpptalpp01.astrazeneca.net:5000/api/read/maa?length=3')
36 GET /api/read/maa?length=3 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
34 GET /api/read/maa?length=4 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
33 GET /api/read/maa?length=5 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
23 GET /api/read/maa?length=6 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
24 GET /api/read/maa?length=7 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
13 GET /api/read/maa?length=8 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
5 GET /api/read/maa?length=9 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
24 GET /api/read/products/1093 ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
29 GET /api/read/products/search?search=lynparza ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
1 GET /api/read/products/search?search=lynparza HTTPError('500 Server Error: INTERNAL SERVER ERROR for url: http://iecdalpptalpp01.astrazeneca.net:5000/api/read/products/search?search=lynparza')
Мой locustfile выглядит следующим образом:
время импорта из locust import HttpUser, task, между
class QuickstartUser(HttpUser):
wait_time = between(1, 2)
@task
def index_page(self):
self.client.get("/api/read/products/1093")
self.client.get("/api/read/products/search?search=lynparza")
@task(3)
def view_item(self):
for item_id in range(10):
self.client.get(f"/api/read/maa?length={item_id}")
time.sleep(0.5)
# def on_start(self):
# self.client.post("/login", json={"username": "foo", "password": "bar"})
Комментарии:
1. просто чтобы уточнить: вы хотите, чтобы время ожидания locust истекло до того, как это сделает сервер, или вы хотите, чтобы сервер прекратил закрывать соединения?
2. Я хотел бы увеличить время ожидания для ответа в locust, но если я могу что-нибудь сделать, чтобы остановить сервер, закрывающий соединения, которые могут быть достаточно хорошими
3. Это сервер, который закрывает соединение, поэтому я не думаю, что locust может что-то с этим сделать. Может быть, проверьте конфигурацию вашего сервера?
4. любые подсказки, я на самом деле не серверный парень. Я использую uwsgi на RHEL 7. Я могу выполнять вызовы конечной точки вручную, просматривать браузер до конечной точки и не получать никаких проблем. Даже не используя nginx.
Ответ №1:
После долгой возни я увеличил количество открытых файлов в Linux и nginx, увеличил очередь сокетов со 100 до 1024 и использовал пул баз данных oracle с threaded=True при создании пула сеансов — и теперь я получаю разумные результаты.
sysctl -w net.core.somaxconn=1024
https://www.cyberciti.biz/faq/linux-unix-nginx-too-many-open-files/