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?


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) .


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.


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


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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.