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

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

$ 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*[{docker}]
  ├─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
25
задан Kamil Maciorowski
17.04.2023 16:07 Количество просмотров материала 3693
Распечатать страницу

1 ответ

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


Edit: я нашел в этой статье (датированный 3-ое мая 2017); кажется, что поддерживает мое Угадай:

тем временем, новый и намного лучше SO_REUSEPORT реализация была доведена до ядра Linux 3.9, что позволяет разумно распределить нагрузку на несколько сокетов. HAProxy может сразу же извлечь выгоду из этого нового улучшения.

но он пришел с проблемой...]

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

3
отвечен Kamil Maciorowski 2023-04-18 23:55

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх