Mehrere Prozesse überwachen denselben Port; wie ist es möglich?

3861
Kundan

Mehrere Prozesse überwachen denselben Port. Soweit ich weiß, kann nur ein Prozess einen Port abhören. Ist es möglich (wie?), Dass mehrere Prozesse denselben Port abhören können?

$ 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 Ausgabe:

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 config:

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
Was ist deine Haproxy-Konfiguration? Servern Sie mehrere Domains? Jaroslav Kucera vor 6 Jahren 2
Haproxy-Konfig hinzugefügt Kundan vor 6 Jahren 0
Wie viele IPs haben Sie aktiv (einschließlich localhost)? Wenn 3, ist das wahrscheinlich der Grund. Jaroslav Kucera vor 6 Jahren 0
Das hat nichts mit ip zu tun. Ich konnte 10 Instanzen von Haproxy ausführen. Kundan vor 6 Jahren 0
"* Soweit ich weiß, kann nur ein Prozess an einem Port zuhören." "Ich bin nicht sicher, warum Sie das denken würden, aber es ist sicherlich nicht wahr. Der offensichtlichste Weg, um zu sehen, wie das nicht richtig sein kann - nehmen wir an, ein Prozess lauscht an einem Port und ruft dann "Fork" auf. Wenn nur ein Prozess diesen Port abhören kann - welcher wäre das? David Schwartz vor 6 Jahren 1
Fork erstellt einen neuen untergeordneten Prozess. Aber wie ich an pstree sehen kann, handelt es sich nicht um untergeordnete Prozesse. Kundan vor 6 Jahren 0

1 Antwort auf die Frage

3
Kamil Maciorowski

Es ist möglich. Ziel ist es, mehrere eingehende Verbindungen parallel zu verarbeiten. Mehrere haproxyInstanzen verwenden möglicherweise separate CPU-Kerne und arbeiten (halb) unabhängig voneinander. Eingehende Verbindungen werden an den Leerlauf übergeben haproxy(sofern verfügbar), anstatt sich in der Warteschlange zu beschäftigen.

Ich denke haproxy, Verwendungen SO_REUSEPORT. man 7 socketerklärt diese Option wie folgt:

SO_REUSEPORT (seit Linux 3.9)

Erlaubt, dass mehrere AF_INEToder AF_INET6Sockets an eine identische Socketadresse gebunden werden. Diese Option muss an jedem Sockel (einschließlich des ersten Sockels) eingestellt werden, bevor bind(2)der Sockel aufgerufen wird. Um das Port-Hijacking zu verhindern, müssen alle an dieselbe Adresse gebundenen Prozesse dieselbe effektive UID haben. Diese Option kann sowohl für TCP- als auch für UDP-Sockets verwendet werden.

Bei TCP-Sockets kann mit dieser Option die accept(2)Lastverteilung in einem Multithread-Server verbessert werden, indem für jeden Thread ein eigener Listener-Socket verwendet wird. Dies bietet im Vergleich zu herkömmlichen Verfahren eine verbesserte Lastverteilung, z. B. die Verwendung eines Single- accept(2)Thread, der Verbindungen verteilt, oder mehrere Threads, die mit accept(2)demselben Socket konkurrieren .

Überprüfen Sie auch SO_ATTACH_REUSEPORT_CBPFund SO_ATTACH_REUSEPORT_EBPFdort.


Edit: Ich fand diesen Artikel (vom 3. Mai 2017); es scheint meine Vermutung zu stützen:

Inzwischen wurde eine neue und wesentlich bessere SO_REUSEPORTImplementierung in den Linux-Kernel 3.9 eingeführt, wodurch die Last intelligent auf mehrere Sockets verteilt werden konnte. HAProxy könnte sofort von dieser neuen Verbesserung profitieren.

Aber es kam mit einem Problem [...]

Mach dir keine Sorgen über das Problem. Der Artikel beschreibt Problemumgehungen und eine Lösung. Vielleicht finden Sie es interessant, wenn Sie sich für solche Sachen interessieren.