TCP-Loopback-Verbindung im Vergleich zur Leistung des Unix Domain Socket

115

Arbeiten an einer Android- und iOS-basierten Anwendung, die die Kommunikation mit einem Server erfordert, der auf demselben Gerät ausgeführt wird. Derzeit wird eine TCP-Loopback-Verbindung für die Kommunikation mit App und Server verwendet (App in Benutzerebene geschrieben, Server in C ++ mit Android NDK geschrieben)

Ich habe mich gefragt, ob das Ersetzen der Interkommunikation durch den Unix Domain-Socket die Leistung verbessern würde.

Oder gibt es im Allgemeinen Beweise / Theorien, die beweisen, dass der Unix Domain-Socket eine bessere Leistung als eine TCP-Loopback-Verbindung bietet?

RDX
quelle
3
Denken Sie daran, dass lokale Sockets (UNIX-Domain-Sockets) eine Datei im Dateisystem benötigen. Durch die Verwendung der TCP-Loopback-Adresse bleibt alles im Speicher. Und wenn Sie Remote-TCP-Sockets verwenden müssen, ist es möglicherweise einfacher, einen anderen TCP-Socket zu integrieren, als mit einer neuen Socket- und Adressfamilie zu spielen.
Einige Programmierer Typ
1
@JoachimPileborg Bei der Entwicklung nur für Linux (Android) besteht die Möglichkeit, abstrakte UNIX-Domain-Socket-Adressen zu verwenden, für die keine Datei im Dateisystem erforderlich ist.
Thuovila
siehe stackoverflow.com/questions/14643571/... für Android - Verbindung.
RDX
8
@Someprogrammerdude Sie benötigen eine Datei im Dateisystem, aber das bedeutet nicht, dass alles auf die Festplatte und zurück geht.
Marquis von Lorne
3
@Someprogrammerdude Nur die Dateinamen-, Besitz- und Berechtigungsinformationen werden jemals im Dateisystem gespeichert. Die gesamte eigentliche Datenübertragung erfolgt vollständig im Speicher.
Jesin

Antworten:

104

Ja, die lokale Interprozesskommunikation über Unix-Domain-Sockets sollte schneller sein als die Kommunikation über Loopback-Localhost-Verbindungen, da Sie weniger TCP-Overhead haben (siehe hier) .

0x4a6f4672
quelle
12
Der erste Link zitiert den zweiten Link aus dem Jahr 2005 (alt). und es deckt nur FreeBSD
Janus Troelsen
7
Diese Antwort ist falsch, wenn das getestete Loopback-TCP unter modernem Linux genauso schnell und manchmal schneller als UDS ist. kann bei Bedarf Benchmark liefern
easytiger
10
Diese Antwort ist absolut richtig. Die Loopback-Schnittstelle ist immer noch TCP, was bedeutet, dass Sie immer noch den Overhead von TCP haben (Überlastungskontrolle, Flusskontrolle, Stream-Management (IP-Paketreihenfolge, Neuübertragung usw.)). Unix-Domain-Sockets führen keine der oben genannten Aktionen aus, da sie von Grund auf für die lokale Ausführung konzipiert wurden. Dies bedeutet, dass keine Überlastungsprobleme auftreten, keine Geschwindigkeitsunterschiede zwischen Server / Client, für die eine Flusskontrolle erforderlich ist, keine verworfenen Pakete usw. Google dies im Zweifelsfall , keine neue Sache.
JSON
4
Was ist mit lokalem UDP?
CMCDragonkai
2
vorausgesetzt, der erste Link ist tot (HTTP 404) ... aus diesem Grund empfiehlt es sich, zum Zeitpunkt des Antwortschreibens (dann, wenn der Link ausfällt) mindestens ein kurzes / präzises relevantes Zitat aus der Quell-URL bereitzustellen Die kurze Zusammenfassung ist noch verfügbar.
Trevor Boyd Smith
80

Dieser Benchmark: https://github.com/rigtorp/ipc-bench bietet Latenz- und Durchsatztests für TCP-Sockets, Unix Domain Sockets (UDS) und PIPEs.

Here you have the results on a single CPU 3.3GHz Linux machine :

TCP average latency: 6 us

UDS average latency: 2 us

PIPE average latency: 2 us

TCP average throughput: 0.253702 million msg/s

UDS average throughput: 1.733874 million msg/s

PIPE average throughput: 1.682796 million msg/s

Eine Reduzierung der Latenz um 66% und ein fast 7-facher Durchsatz erklären, warum die meisten leistungskritischen Programme über ein eigenes benutzerdefiniertes IPC-Protokoll verfügen.

Guillermo Lopez
quelle
7
Klingt für mich so, als wäre ihr Produkt eine Antwort auf das Problem! Vielleicht beantworten sie deshalb diese Fragen; weil sie eine Antwort kennen.
GreenReaper
Dies ist eine großartige Antwort, da es einige Zahlen gibt. Der Durchsatz von TCP zu UNIX ist 350% besser, von UNIX zu PIPE 40% auf einem i5.
ScalaWilliam
13
@GreenReaper Die Antwort ist in der Tat relevant, aber die Linie unseres Torusware Speedus-Produkts ... wird mit 2 Versionen geliefert, Speedus Lite und Speedus Extreme Performance (EP) nicht, und das Ganze klingt wie eine billige Anzeige.
Dmitry Grigoryev
3
Spam. Und nein, sein Produkt ist für einen Vergleich zwischen TCP- und Unix-Sockets nicht relevant. Es gibt viele vernünftige Alternativen zu Steckdosen - jede außerhalb dessen, was das OP verlangt
JSON
Die Verwendung dieses Tools wird nicht ausreichend erklärt. Gibt es eine Seite, auf der erklärt wird, wie man Client und Server anruft?
Falkb
40

Der Redis- Benchmark zeigt, dass der Unix-Domain-Socket schneller als der TCP-Loopback sein kann.

Wenn die Server- und Client-Benchmark-Programme auf derselben Box ausgeführt werden, können sowohl der TCP / IP-Loopback- als auch der Unix-Domänensocket verwendet werden. Je nach Plattform können Unix-Domain-Sockets einen um etwa 50% höheren Durchsatz erzielen als der TCP / IP-Loopback (z. B. unter Linux). Das Standardverhalten von Redis-Benchmark ist die Verwendung des TCP / IP-Loopbacks.

Dieser Unterschied ist jedoch nur bei hohem Durchsatz von Bedeutung.

Durchsatz pro Datengröße

Holzungen
quelle
8

Unix-Domain-Sockets sind häufig doppelt so schnell wie TCP-Sockets, wenn sich beide Peers auf demselben Host befinden. Die Unix-Domänenprotokolle sind keine eigentliche Protokollsuite, sondern eine Möglichkeit, die Client / Server-Kommunikation auf einem einzelnen Host mithilfe derselben API durchzuführen, die für Clients und Server auf verschiedenen Hosts verwendet wird. Die Unix-Domänenprotokolle sind eine Alternative zu den IPC-Methoden (Interprocess Communication).

peterDriscoll
quelle