Приложение Flask блокируется несколькими процессами - PullRequest
1 голос
/ 20 марта 2019

Gunicorn: 19.9.0

Flask: 1.0.2

Python: 3.6.7

У нас есть несколько внутренних API-интерфейсов моделей данных сервера с несколькими тысячамиТреб. / сек.Недавно мы представили новый, и по какой-то причине, когда он обслуживается несколькими процессами (Gunicorn является нашим по умолчанию), он будет обрабатывать несколько сотен запросов и просто блокироваться.

Если я запускаю API как пустой файл без Gunicorn, все работает нормально:

app.run(ip, port=port, threaded=True)

Если я запускаю несколько процессов, он сразу после запуска блокируется:

app.run(ip, port=port, threaded=False, processes=2)

Если я использую Gunicorn с workers=1, он тоже блокируется, вот конфиг:

preload_app = False
bind = "0.0.0.0:{}".format(8889)
workers = 1
debug = False
timeout = 120

Я закомментировал весь код в конечной точке, и это не повлияло на его блокировкувверх.Это похоже на конфликт с зависимостью, но у меня возникают проблемы с ее точным указанием.

Если я пытаюсь подключиться, используя strace, пока он заблокирован, я получаю плотный цикл со следующим выводом намастер процесса Gunicorn:

strace: Process 4387 attached
select(4, [3], [], [], {tv_sec=0, tv_usec=832486}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0

Любые предложения о том, куда идти или что попробовать на этом этапе?

1 Ответ

1 голос
/ 20 марта 2019

Похоже, это произошло из-за сочетания количества клиентов и отсутствия обратного прокси-сервера (например, nginx) перед ним. Недостаточно рабочих, чтобы начать ставить в очередь запросы по сравнению с количеством клиентов, что ошеломило рабочих до такой степени, что они перестали отвечать. Я увеличил число рабочих до 60, и пропускная способность стала намного стабильнее.

...