Несколько процессов прослушивают один и тот же порт; как это возможно?

3801
Kundan

Несколько процессов прослушивают один и тот же порт. Но, насколько я знаю, только один процесс может прослушивать порт. Возможно ли (как?), Что несколько процессов могут прослушивать один и тот же порт?

$ sudo lsof -n -i :80 | grep LISTEN haproxy 2039 root 4u IPv4 12874 0t0 TCP *:http (LISTEN) haproxy 2042 root 4u IPv4 12898 0t0 TCP *:http (LISTEN) haproxy 2045 root 4u IPv4 12923 0t0 TCP *:http (LISTEN) 

pstree выход:

init ├─acpid -c /etc/acpi/events -s /var/run/acpid.socket ├─atd ├─cron ├─dbus-daemon --system --fork ├─dhclient -1 -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0  ├─docker -d │ └─6*[] ├─getty -8 38400 tty4 ├─getty -8 38400 tty5 ├─getty -8 38400 tty2 ├─getty -8 38400 tty3 ├─getty -8 38400 tty6 ├─getty -8 38400 tty1 ├─getty -8 38400 ttyS0 ├─haproxy -f /etc/haproxy/haproxy.cfg ├─haproxy -f /etc/haproxy/haproxy.cfg ├─haproxy -f /etc/haproxy/haproxy.cfg 

Конфигурация haproxy:

global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy user ubuntu group ubuntu daemon   defaults log global mode http option httplog option dontlognull contimeout 5000 clitimeout 50000 srvtimeout 50000  listen appname 0.0.0.0:80 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor server lamp1 172.31.20.0:81 check server lamp2 172.31.20.1:81 check 
3
Какая у вас конфигурация haproxy? Вы обслуживаете несколько доменов? Jaroslav Kucera 6 лет назад 2
добавлен конфиг haproxy Kundan 6 лет назад 0
Сколько IP-адресов у вас активно (включая localhost)? Если 3, это, вероятно, причина. Jaroslav Kucera 6 лет назад 0
Это не связано с IP. Мне удалось запустить 10 экземпляров haproxy. Kundan 6 лет назад 0
«* Насколько я знаю, только один процесс может прослушивать порт. *« Я не уверен, почему вы так думаете, но это, безусловно, неправда. Для наиболее очевидного способа понять, как это не может быть правильным - предположим, что процесс прослушивает порт, а затем вызывает `fork`. Если только один процесс может прослушивать этот порт - какой это будет? David Schwartz 6 лет назад 1
fork создаст новый дочерний процесс. Но, как я вижу из pstree, это не дочерние процессы. Kundan 6 лет назад 0

1 ответ на вопрос

3
Kamil Maciorowski

Это возможно. Цель состоит в том, чтобы обрабатывать несколько входящих соединений параллельно. Несколько 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 может немедленно извлечь выгоду из этого нового улучшения.

Но это пришло с проблемой [...]

Не беспокойся о проблеме. В статье описываются обходные пути и решения. Вы можете найти это интересным, если вам нравятся такие вещи.