LINUX.ORG.RU

сокеты в python: глубина очереди в socket.listen( )

 ,


1

3

Доброго времени суток

Документация модуля socket оставила в недоумении

socket.listen(backlog)

Listen for connections made to the socket. The backlog argument specifies the maximum number of queued connections and should be at least 0; the maximum value is system-dependent (usually 5), the minimum value is forced to 0.

Т.е. 5 соединений попали в очередь, 6е получило reject ( icmp port unreachable ), так? И этот reject придётся обрабатывать на клиенте, если нужна надёжная доставка.

Но если отвлечься от питона, современные reverse proxy спокойно выдерживают десятки и сотни тысяч одновременных запросов

Как эти два факта согласуются?

  1. модуль socket в python'е это вам не для highload ?
  2. reverse proxy задирает backlog до космических значений
  3. backlog это время только в queue, и вызов socket.accept забирает соединение из очереди. Т.е. reverse proxy многопоточные, один поток максимально быстро выполняет accept и перекидывает задачу на другой поток, освобождая очередь

Или, ближе к задаче. Каким образом можно избежать reject'а от переполненной очереди, чтобы высокая нагрузка приводила только к разрыву по tcp connect timeout, но не icmp reject ?

★★★★★

Последнее исправление: router (всего исправлений: 3)

Про backlog написано много и легко гуглится, да это очередь соединений, которым процесс не успел сделать accept().

Многопоточность не обязательно, если сокет не блокирующийся то можно и в цикле успевать делать accept(). Понятно, что если соединений много, то делать на многопроцессорной системе одним потоком неправильно.

А нормальный клиент всегда должен быть готов, что ему будет REJECT, иногда и провайдер (маршрутизатор) может генерить RST пакеты.

mky ★★★★★
()

1. Модуль socket не главная вещь из за которой можно так сказать, но многие вполне себе делают highload на питоне. Вообще - если поставить nginx перед питоном, то все пляски с backlog можно возложить на nginx. Но если очень хочется, то можно и питоном торчать наружу, не так уж всё и плохо.

2. Обычно reverse proxy (haproxy, nginx) позволяют определить backlog в конфиге.

3. Reverse proxy в первую очередь асинхронные, а использовать ли многопоточность или другие способы масштабирования по ядрам - зависит от ситуации.

Каким образом можно избежать reject'а от переполненной очереди, чтобы высокая нагрузка приводила только к разрыву по tcp connect timeout, но не icmp reject?

Выставить backlog в SOMAXCONN, например. Но так делать не надо, почему - ответ в самом вопросе.

ei-grad ★★★★★
()
Последнее исправление: ei-grad (всего исправлений: 2)
Ответ на: комментарий от ei-grad

SOMAXCONN

Упс. Не, SOMAXCONN - захардкожен. Наверное правильнее взять из /proc/sys/net/core/somaxconn. Ну и не забыть его увеличить, а то по-дефолту там 128.

ei-grad ★★★★★
()

backlog это время только в queue, и вызов socket.accept забирает соединение из очереди

Конечно.

Т.е. reverse proxy многопоточные,

Или асинхронные. Точнее, и то, и другое.

один поток максимально быстро выполняет accept и перекидывает задачу на другой поток, освобождая очередь

Примерно так. А асинхронные рабочие используют epoll или другой системно-специфичный быстрый мультиплексор, чтобы не простаивать, ожидая одного клиента.

anonymous
()

Т.е. 5 соединений попали в очередь, 6е получило reject ( icmp port unreachable ), так?

Да. Я думаю, такая маленькая глубина сделана специально чтобы очередь не скапливалась. Если сервис написан нормально то этого хватит для 99% случаев. А если кривой и тормозной то нет смысла копить соединение. Моё имхо, я не автор этого модуля.

Ну а клиент должен быть достаточно умным чтобы уметь в exponential backoff и понимать что RST может означать перегрузку сервера. Хотя, я бы лучше явно отдавал ошибку в случае перегруза чтобы отличать ситуации «сервер недоступен» и «сервер перегружен».

true_admin ★★★★★
()

У Стивенса (Раго) везде бэклог 1024. Понятно, что кто-то должен быстро забирать акцепт, отдавать на обработку другому и снова возвращаться на акцепт. Но 5 выглядит как издевательство.

level1 ★★
()

Можно в качестве фронта использовать реверс прокси не на питоне, а на бекенде фастцги на питоне с мультиплексированием в канале (нгинкс так не умеет).

level1 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.