Прослуховування декількох процесів на одному і тому ж порту; як це можливо?


9

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

$ 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

2
Яка ваша конфігурація haproxy? Ви сервіруєте кілька доменів?
Ярослав Кучера

додав HAProxy конфігурації
Кундан

Скільки IP-адрес у вас є активним (включаючи localhost)? Якщо 3, це, мабуть, причина.
Ярослав Кучера

Це не пов’язано з ip. Мені вдалося запустити 10 екземплярів хапрокси.
Кундан

1
" Але наскільки я знаю, лише один процес може прослухати порт ". Я не впевнений, чому ви так подумаєте, але це, звичайно, неправда. Для найбільш очевидного способу побачити, як це не може бути правильним - припустимо, процес прослуховує порт, а потім він дзвонить fork. Якщо на цьому порту можна слухати лише один процес - який би це був?
Девід Шварц

Відповіді:


7

Можливо. Мета - паралельно обробляти кілька вхідних з'єднань. Кілька 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 може негайно скористатися цим новим удосконаленням.

Але це прийшло з проблемою [...]

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.