SO_REUSEPORT и несколько слушателей в одном потоке - PullRequest
0 голосов
/ 27 марта 2020

Справочные материалы ...

https://lwn.net/Articles/542629/

https://blog.n0p.me/2018/02/2018-02-20-portsharding/

Мне интересно, насколько хорошо эта функция работает с несколькими слушателями в одном потоке?

Например, предположим, что мой сервер устанавливает ограничение в 100 соединений. Используя такую ​​инфраструктуру, как ASIO, может ли он просто создать пул из 100 объектов подключения, каждый из которых слушает асинхронно, пока не примет подключение? Это действительно больше похоже на 100 серверов с одним соединением.

Будет ли несколько слушателей в одном потоке иметь одинаковую или худшую производительность, чем один слушатель?

[править] Я думаю, что отставание в прослушивании может быть проблемой. Даже если в списке задано одно значение, второе соединение может быть поставлено в очередь сразу после принятия первого, и закрытие порта, вероятно, приведет к RST-соединению, а не к переносу его в другое очередь ожидания прослушивания.

1 Ответ

0 голосов
/ 29 марта 2020

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

При 100 акцепторах и 100 коннекторах примерно 60% коннекторов будут распределены на уникальный акцептор в то время как остаток попал в резервы тех же акцепторов (глубина установлена ​​в 1). Если акцептор немедленно закрыл порт после своего первоначального принятия, то процентное увеличение увеличилось случайным образом с отклонением оставшегося остатка.

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

...