Frage Unix-Socket gegenüber TCP / IP-Host: Port


Könnte mir bitte jemand die Vor- und Nachteile einer Unix-Socket-Datei gegenüber einem TCP / IP-Localhost: -Port beschreiben, wenn ich Dienste auf einem Server (Ubuntu, FWIW) einrichte?

In diesem speziellen Fall ist es für einen Python-WSGI-Server (uWSGI), aber ich bin nur an allgemeinen interessiert (zB weiß ich, dass Sie MySQL auf beide Arten einrichten können).

Ich weiß, dass die Verwendung von TCP / IP bedeutet, dass die Dienste anderen Computern zur Verfügung gestellt werden können, aber ich bin nur daran interessiert, ob es Leistungseinbußen beim lokalen Zugriff auf Dienste gibt.

Prost.


40
2017-10-27 13:30


Ursprung


Beide brillante Antworten und wirklich nützlich - danke! :) - Ludo


Antworten:


Unix-Sockets sind ein wenig schneller, da Sie den tcp-Overhead nicht haben. Wenn Sie feststellen, dass dieser Leistungsverlust eine Frage der Serverlast ist. Wenn Sie keine sehr hohe Serverlast haben, werden Sie es nicht erkennen.

Wenn Sie Jails (FreeBSD) oder eine andere Virtualisierungstechnologie verwenden, um z. MySQL-Server vom Webserver, verwenden Sie oft das tcp / ip Setup anstelle von Sockets. Die Firewallregeln müssen den Zugriff jedoch einschränken.

Sie müssen herausfinden, ob Ihr System stark ausgelastet ist, so dass ein Socket ein Muss ist oder Sie sich auf ein schönes Systemdesign konzentrieren können (Trennen von Diensten), dann wäre eine tcp / ip-Lösung besser.

Also mach eine lange Antwort kurz:

Ja, es gibt einen Leistungsunterschied, Steckdosen sind schneller. Wenn Sie keine hohe Serverlast haben, wählen Sie einfach, was besser zum Design Ihres Systems passt.


37
2017-10-27 13:38



Re: Steckdosen sind schneller ... sind das nicht beide Buchsen? - Bart Silverstrim
@Bart Silverstrim: Nein, Sockets sind Sockets; TCP hat eine Socket-ähnliche API - Javier
Ich glaube, sie heißen "Unix Sockets" und "Internet Sockets". (socket(AF_INET, SOCK_STREAM, ...)) - grawity
Ich habe gerade ein paar mysql-Abfragen mit php-mysql getestet (unix vs tcp-socket, beide localhost). zum Beispiel "select SQL_NO_CACHE 1", um Nicht-Transport-Faktoren zu eliminieren. Es gab keinen messbaren Unterschied. BEIDE hatte einen Durchschnitt von 0,25 ms, beste Zeit für BEIDE war 0,19 ms. - jens


Es ist im Grunde ein Kompromiss zwischen Leistung und Flexibilität. Unix-Domain-Sockets geben Ihnen eine etwas bessere Leistung, während ein Socket, das mit localhost verbunden ist, Ihnen eine etwas bessere Portabilität gibt. Sie können die Server-App einfach 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 Client-Prozessen zu erstellen. Wenn der Unix-Domain-Socket verbunden ist, sehen Sie irgendwo eine Datei in / var.

Wenn Sie nach der ultimativen Performance-Lösung suchen, sollten Sie einen Shared-Memory-IPC ausprobieren. Aber das ist ein bisschen komplexer.


9
2017-10-28 00:31





Vorteile von Unix-Domain-Sockets.

  1. Der Zugriff kann über das Unix-Benutzerberechtigungssystem entweder durch Festlegen der Berechtigungen für den Socket selbst oder durch Lesen des Benutzernamens des verbundenen Clients durch den Server erfolgen.
  2. Geringere Gefahr, die Steckdose versehentlich der Außenwelt auszusetzen. Wenn der Server beispielsweise auch einen Web-Proxy ausführt, kann dies versehentlich Verbindungen zu Sockets auf localhost zulassen.

Nachteile von Unix-Domain-Sockets

  1. Nicht zu Nicht-Unix-Systemen übertragbar.
  2. Kann mit Chroot, Gefängnis oder ähnlichem peinlich sein

2
2017-10-19 15:23