Рейтинг:1

UWSGI блокирует входящие соединения, когда все потоки заняты

флаг cn

У меня есть простое приложение UWSGI, помещенное за LB со следующей конфигурацией .ini.

[увсги]
сокет=0.0.0.0:5071
chdir = источник/
wsgi-файл = uwsgi.py
процессы=2
темы = 1
протокол=http
плагины = питон
выход при перезагрузке = ложь
мастер = истина
# Очистка временных файлов
вакуум = правда    

Когда все 2x1 потоки заняты, приложение продолжает служить входящие соединения, ставя их в очередь, ожидая освобождения потока.

Это в некотором роде нежелательное поведение в моем случае, так как я хотел бы, чтобы UWSGI возвращал код состояния 5xx, который позволит мне не перенасыщать ресурсы одного дистрибутива.

Код тестирования клиента

Прикрепление кода тестового клиента для приложения UWSGI

прокси = {
    'http': 'http://локальный: 5071'
}

@резьбовой
защита f():
    print('Отправка запроса')
    ответ = запросы.получить('http://dummy.site',прокси=прокси)
    print(str(response.status_code)+ response.text)

для я в диапазоне (5):
    е()

Тест (1)

Добавление слушать = 2 в .ini и одновременное выполнение 3 запросов просто напечатает:

*** Очередь прослушивания uWSGI сокета "0.0.0.0:5071" (fd: 3) заполнена !!! (3/2) ***

в то время как третье соединение, кажется, все еще каким-то образом принимается, ставится в очередь и позже выполняется вместо 5хх вылетает ошибка.

Тест (2)

Добавление слушать = 0 в .ini и запуская 5 запросов одновременно, просто выполнялись бы два запроса за раз. Полный вывод очереди больше не отображается. Каким-то образом запросы где-то все еще находятся в очереди и выполняются, когда потоки освобождаются.

Как я могу заблокировать входящие подключения к приложению UWSGI, когда все потоки заняты?

anx avatar
флаг fr
anx
В вашей конфигурации порт и очередь прослушивания отличаются от зарегистрированного сообщения. Вы запускаете два экземпляра и проверяете не то, что хотели? Кроме того, *почти* каждый вариант использования работает лучше с (по крайней мере, небольшим) бэклогом прослушивания — когда закончите, проверьте, действительно ли ваши показатели производительности соответствуют вашим ожиданиям.
Constantin avatar
флаг cn
@anx просто ошибка, когда я переключал порты, когда писал вопрос. Что касается отставания, на какой вариант (ы) вы особенно ссылаетесь?
anx avatar
флаг fr
anx
Может быть, клиент, который вы используете для проверки, **повторяет** *после* uwsgi отклоняет попытку подключения один раз? Может быть, ваша конфигурация сработала, а метод тестирования — нет?
Constantin avatar
флаг cn
@anx Он вообще не повторяется, используя простой `requests.get(url,proxy)` в python
Рейтинг:0
флаг cz

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

Constantin avatar
флаг cn
При `listen = 0` все, что происходит, это то, что вывод заполненной очереди больше не отображается. Все равно кажется, что "где-то" он висит, пока нити не освободится. Я прикрепил свой тестовый клиент к вопросу. Спасибо!
Michael Hampton avatar
флаг cz
@Constantin Возможно, это просто невозможно. Я не смог найти никого, кто хотя бы пытался это сделать.
Constantin avatar
флаг cn
Спасибо за ответ.Это на самом деле странно - мне интересно, почему веб-сервер не должен иметь возможность ограничивать количество подключений. Особенно, когда эти приложения размещены за целой инфраструктурой, предназначенной для работы с балансировщиками нагрузки, группами автоматического масштабирования и рассчитанными предварительно выделенными ресурсами.

Ответить или комментировать

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