Это возможно. Цель состоит в том, чтобы обрабатывать несколько входящих соединений параллельно. Несколько haproxy
экземпляров могут использовать отдельные ядра процессора и работать (полу) независимо. Входящее соединение будет переведено в режим ожидания haproxy
(если доступно) вместо того, чтобы ставиться в очередь на занятое.
Я думаю, haproxy
использует SO_REUSEPORT
. man 7 socket
объясняет эту опцию так:
SO_REUSEPORT
(начиная с Linux 3.9)Разрешает привязку нескольких
AF_INET
илиAF_INET6
сокетов к одному и тому же адресу сокета. Эта опция должна быть установлена на каждом сокете (включая первый сокет) до вызоваbind(2)
на сокете. Чтобы предотвратить перехват порта, все процессы, привязанные к одному и тому же адресу, должны иметь один и тот же эффективный UID. Эта опция может использоваться с сокетами TCP и UDP.Для сокетов TCP эта опция позволяет
accept(2)
улучшить распределение нагрузки на многопоточном сервере, используя отдельный сокет слушателя для каждого потока. Это обеспечивает улучшенное распределение нагрузки по сравнению с традиционными методами, такими как использование однопотоковогоaccept(2)
потока, который распределяет соединения, или наличие нескольких потоков, конкурирующихaccept(2)
с одним сокетом.
Также проверьте SO_ATTACH_REUSEPORT_CBPF
и SO_ATTACH_REUSEPORT_EBPF
там.
Изменить: я нашел эту статью (от 3 мая 2017 года); кажется, поддерживает мое предположение:
Между тем,
SO_REUSEPORT
в ядро Linux 3.9 была добавлена новая и намного лучшая реализация, позволяющая разумно распределять нагрузку по нескольким сокетам. HAProxy может немедленно извлечь выгоду из этого нового улучшения.Но это пришло с проблемой [...]
Не беспокойся о проблеме. В статье описываются обходные пути и решения. Вы можете найти это интересным, если вам нравятся такие вещи.