Unix-Socket vs TCP / IP-Host: Port

42

Könnte mir bitte jemand die Vor- und Nachteile der Verwendung einer Unix-Socket-Datei gegenüber einem TCP / IP-Localhost: -Port beim Einrichten von Diensten auf einem Server (Ubuntu, FWIW) beschreiben?

In diesem speziellen Fall handelt es sich um einen Python-WSGI-Server (uWSGI), aber ich interessiere mich nur für das Allgemeine (z. B. ich weiß, dass Sie MySQL auf beide Arten einrichten können).

Mir ist klar, dass die Verwendung von TCP / IP bedeutet, dass die Dienste anderen Computern zugänglich gemacht werden können, aber ich bin nur daran interessiert, ob es beim lokalen Zugriff auf Dienste Leistungseinbußen gibt.

Prost.

Ludo
quelle
1
Geniale Antworten und sehr nützlich - danke! :)
Ludo

Antworten:

40

Unix-Sockets sind etwas schneller, da Sie keinen TCP-Overhead haben. Wenn Sie feststellen, dass dieser Leistungsverlust eine Frage der Serverlast ist. Wenn die Serverlast nicht sehr hoch ist, wird sie nicht erkannt.

Wenn Sie Jails (FreeBSD) oder eine andere Virtualisierungstechnologie verwenden, um z. B. den MySQL-Server vom Webserver zu trennen, verwenden Sie häufig das TCP / IP-Setup anstelle von Sockets. Die Firewall-Regeln müssen den Zugriff jedoch einschränken.

Sie müssen herausfinden, ob Ihr System stark ausgelastet ist, damit ein Socket ein Muss ist, oder Sie können sich auf ein ansprechendes Systemdesign (Trennen von Diensten) konzentrieren. Dann ist eine TCP / IP-Lösung besser.

Also mach eine lange Antwort kurz:

Ja, es gibt einen Leistungsunterschied, die Steckdosen sind schneller. Wenn Sie nicht unter hoher Serverauslastung leiden, wählen Sie einfach, was besser zum Design Ihres Systems passt.

Benedikt Niessen
quelle
3
Re: Steckdosen sind schneller ... sind das nicht beide Steckdosen?
Bart Silverstrim
4
@ Bart Silverstrim: nein, buchsen sind buchsen; TCP hat eine Socket-ähnliche API
Javier
7
Ich glaube, sie heißen "Unix-Sockets" und "Internet-Sockets". ( socket(AF_INET, SOCK_STREAM, ...))
Grawity
1
ich habe gerade ein paar mysql-abfragen mit php-mysql getestet (unix vs tcp-socket, beide localhost). Beispiel: "SQL_NO_CACHE 1 auswählen", um Nicht-Transportfaktoren zu eliminieren. Es war kein Unterschied messbar. BOTH hatte einen Durchschnitt von 0.25 ms, die beste Zeit für BOTH war 0.19 ms.
27.
11

Es ist im Grunde ein Kompromiss zwischen Leistung und Flexibilität. Unix-Domain-Sockets bieten eine etwas bessere Leistung, während ein mit localhost verbundener Socket die Portabilität verbessert. Sie können die Server-App problemlos auf ein anderes Betriebssystem verschieben, indem Sie einfach die IP-Adresse von localhost in einen anderen Hostnamen ändern.

Ein Unix-Domain-Socket verwendet das lokale Dateisystem, um einen IPC-Mechanismus zwischen den Server- und Clientprozessen zu erstellen. Sie sehen eine Datei in / var irgendwo, wenn der Unix-Domain-Socket verbunden ist.

Wenn Sie nur die ultimative Performance-Lösung suchen, sollten Sie einen IPC mit gemeinsamem Speicher ausprobieren. Aber das ist etwas komplexer.

IAPaddler
quelle
3

Vorteile von Unix-Domain-Sockets.

  1. Der Zugriff kann über das Unix-Benutzerberechtigungssystem verwaltet werden, indem entweder die Berechtigungen für den Socket selbst festgelegt werden oder der Server den Benutzernamen des verbindenden Clients liest.
  2. Geringere Wahrscheinlichkeit, dass die Steckdose versehentlich der Außenwelt ausgesetzt wird. Wenn der Server beispielsweise auch einen Webproxy ausführt, kann dies dazu führen, dass versehentlich Verbindungen zu Sockets auf localhost zugelassen werden.

Nachteile von Unix-Domain-Sockets

  1. Nicht portierbar auf Nicht-Unix-Systemen.
  2. Kann mit chroots, Gefängnissen oder ähnlichem umständlich sein
Peter Green
quelle