Mit dem obigen Beispiel bekomme ich eine Umlaufzeit von ~ 65μsec. Wenn ich zwei Fifos im Dateisystem anlege, geht das auf ~ 45μsec herunter. Die zusätzliche Zeit mit Localhost Sockets muss sein, weil ich den Netzwerk-Stack treffe.
Ja, und das ist zu erwarten.
FIFOs sind eher primitive Kommunikationsmethode. Ihr Zustand ist im Wesentlichen eine boole Variable. Lese- und Schreibvorgänge durchlaufen denselben vorab zugewiesenen Puffer fester Größe. Somit kann und wird das OS die Operationen optimieren.
Steckdosen sind komplexer. Sie haben die vollwertige TCP-Zustandsmaschine. Die Pufferung ist dynamisch und bidirektional (recv, send werden getrennt gepuffert). Das bedeutet, wenn Sie etwas in den lokalen Socket schreiben, haben Sie praktisch immer eine Art dynamisches Speichermanagement. Linux versucht dies so weit wie möglich zu vermeiden: Überall werden Nullkopie/Einzelkopie-Tricks implementiert. Da die Anrufe jedoch mehr Code durchlaufen müssen, sind sie natürlich langsamer.
Am Ende, wenn man bedenkt, wie viel mehr Sockets im Vergleich zu FIFOs sind, ist 20us Unterschied offen gesagt eine Aussage darüber, wie gut die Socket-Leistung von Linux ist.
P.S. 65us rtt = ~ 35us in einer Richtung. 1s/35us = ~ 30K Pakete pro Sekunde. Für Netzwerk-Code ohne Optimierungen mit einer einzelnen Verbindung, die richtig klingt.
Sie verwenden einen 2.4-basierten Kernel? Das ist ein Teil des Problems. –
Ja, ich benutze auch noch einen Plattenspieler;) Weißt du, ob eine spätere Version des Kernals den lokalen Netzwerkverkehr anders optimieren wird? – Jonathan
Wahrscheinlich nicht, könnten Sie erklären, warum die Verwendung von Named Pipes nicht geeignet ist? Haben Sie versucht, UDP anstelle von TCP zu verwenden? (DatagramSocket) – Ivan