Jeder scheint zu sagen, dass Named Pipes schneller sind als IPC-Sockets. Wie viel schneller sind sie? Ich würde es vorziehen, Sockets zu verwenden, da diese eine bidirektionale Kommunikation ermöglichen und sehr flexibel sind, aber Geschwindigkeit gegenüber Flexibilität wählen, wenn es sich um einen beträchtlichen Betrag handelt.
linux
performance
sockets
ipc
named-pipes
user19745
quelle
quelle
pipe(2)
(ähmmkfifo(3)
?) ist vielleicht der Gewinner, aber Sie werden es nicht wissen, bis Sie es versuchen.Antworten:
Ich würde vorschlagen, dass Sie zuerst den einfachen Weg gehen und den IPC-Mechanismus sorgfältig isolieren, damit Sie von Muffe zu Rohr wechseln können, aber ich würde definitiv zuerst mit Muffe gehen. Sie sollten sicher sein, dass die IPC-Leistung ein Problem darstellt, bevor Sie eine präventive Optimierung durchführen.
Und wenn Sie aufgrund der IPC-Geschwindigkeit in Schwierigkeiten geraten, sollten Sie in Betracht ziehen, auf gemeinsam genutzten Speicher zu wechseln, anstatt auf Pipe umzusteigen.
Wenn Sie Übertragungsgeschwindigkeitstests durchführen möchten, sollten Sie socat ausprobieren , ein sehr vielseitiges Programm, mit dem Sie fast jede Art von Tunnel erstellen können.
quelle
Die besten Ergebnisse erzielen Sie mit der Shared Memory- Lösung.
Named Pipes sind nur 16% besser als TCP-Sockets .
Ergebnisse werden mit IPC-Benchmarking erzielt :
Rohrbenchmark:
Benchmark für FIFOs (Named Pipes):
Message Queue-Benchmark:
Shared Memory-Benchmark:
Benchmark für TCP-Sockets:
Benchmark für Unix-Domain-Sockets:
ZeroMQ-Benchmark:
quelle
Ich werde Shodanex zustimmen, es sieht so aus, als würden Sie vorzeitig versuchen, etwas zu optimieren, das noch nicht problematisch ist. Wenn Sie nicht wissen, dass Steckdosen ein Engpass sein werden, würde ich sie einfach verwenden.
Viele Leute, die auf Named Pipes schwören, finden ein wenig Ersparnis (abhängig davon, wie gut alles andere geschrieben ist), erhalten jedoch Code, der mehr Zeit für das Blockieren einer IPC-Antwort benötigt als für nützliche Arbeit. Sicher, nicht blockierende Schemata helfen dabei, aber diese können schwierig sein. Ich kann sagen, dass die Beschleunigung Jahre damit verbracht hat, alten Code in die Moderne zu bringen. In den meisten Fällen, die ich gesehen habe, ist die Beschleunigung fast gleich Null.
Wenn Sie wirklich glauben, dass Sockets Sie verlangsamen werden, gehen Sie mit gemeinsamem Speicher aus dem Gate und achten Sie dabei sorgfältig darauf, wie Sie Sperren verwenden. Auch hier kann es vorkommen, dass Sie eine kleine Beschleunigung feststellen. Beachten Sie jedoch, dass Sie einen Teil davon verschwenden, indem Sie auf Sperren für gegenseitigen Ausschluss warten. Ich werde keine Reise in die Futex-Hölle befürworten ( na ja , 2015 nicht mehr ganz die Hölle, abhängig von Ihrer Erfahrung).
Pfund für Pfund sind Sockets (fast) immer der beste Weg, um IPC für den Benutzerbereich unter einem monolithischen Kernel zu erhalten. Und (normalerweise) am einfachsten zu debuggen und zu warten.
quelle
Beachten Sie, dass Sockets nicht unbedingt IP (und TCP oder UDP) bedeuten. Sie können auch UNIX-Sockets (PF_UNIX) verwenden, die eine spürbare Leistungsverbesserung gegenüber der Verbindung zu 127.0.0.1 bieten
quelle
Wie oft sagen Zahlen mehr als nur ein Gefühl, hier sind einige Daten: Pipe vs Unix Socket Performance (opendmx.net) .
Dieser Benchmark zeigt einen Unterschied von etwa 12 bis 15% schnellerer Geschwindigkeit für Rohre.
quelle
Wenn Sie keine Geschwindigkeit benötigen, sind Steckdosen der einfachste Weg!
Wenn es um Geschwindigkeit geht, ist die schnellste Lösung Shared Memory, nicht Named Pipes.
quelle
Für die bidirektionale Kommunikation mit Named Pipes:
Named Pipes sind recht einfach zu implementieren.
Zum Beispiel habe ich ein Projekt in C mit Named Pipes implementiert, dank der Kommunikation zwischen Standard-Dateieingabe und -ausgabe (fopen, fprintf, fscanf ...) war es so einfach und sauber (wenn das auch eine Überlegung ist).
Ich habe sie sogar mit Java codiert (ich habe Objekte serialisiert und über sie gesendet!)
Benannte Rohre haben einen Nachteil:
quelle
Ein Problem mit Sockets ist, dass sie keine Möglichkeit haben, den Puffer zu leeren. Es gibt einen sogenannten Nagle-Algorithmus, der alle Daten sammelt und nach 40 ms löscht. Wenn es also um Reaktionsfähigkeit und nicht um Bandbreite geht, sind Sie mit einer Pipe möglicherweise besser dran.
Sie können den Nagle mit der Socket-Option TCP_NODELAY deaktivieren, aber das Leseende empfängt niemals zwei Kurznachrichten in einem einzigen Leseanruf.
Also teste es, ich habe nichts davon gefunden und speicherabgebildete Warteschlangen mit Pthread-Mutex und Semaphor im gemeinsamen Speicher implementiert, um viele Kernel-Systemaufrufe zu vermeiden (aber heute sind sie nicht mehr sehr langsam).
quelle
Benannte Rohre und Muffen sind funktional nicht gleichwertig. Sockets bieten mehr Funktionen (sie sind zunächst bidirektional).
Wir können Ihnen nicht sagen, welche besser abschneiden wird, aber ich vermute sehr, dass es keine Rolle spielt.
Unix-Domain-Sockets machen so ziemlich das Gleiche wie TCP-Sockets, aber nur auf dem lokalen Computer und mit (vielleicht etwas) geringerem Overhead.
Wenn ein Unix-Socket nicht schnell genug ist und Sie viele Daten übertragen, sollten Sie den gemeinsam genutzten Speicher zwischen Ihrem Client und Server verwenden (was viel komplizierter einzurichten ist).
Unix und NT haben beide "Named Pipes", aber sie unterscheiden sich völlig im Funktionsumfang.
quelle
Sie können eine leichte Lösung wie ZeroMQ [ zmq / 0mq ] verwenden. Es ist sehr einfach zu bedienen und dramatisch schneller als Steckdosen.
quelle
nanomsg
. Wie auch immer, begrüße und genieße diesen großartigen Ort und werde ein aktiv beitragendes Mitglied.