2010-07-27 7 views
5

Im Anschluss an meine letzte Frage:Sockel Leistung auf Linux

Performance issue using Javas Object streams with Sockets

Ich bin an der Buchse Leistung auf Linux suchen. Mit dem obigen Beispiel bekomme ich eine Umlaufzeit von ~ 65 μ sek. Wenn ich zwei fifos auf dem Dateisystem mache, geht das auf ~ 45 μ sek. Die zusätzliche Zeit mit Localhost Sockets muss sein, weil ich den Netzwerk-Stack treffe.

Gibt es eine OS-Konfiguration, die einen Localhost-Socket so schnell wie eine Named Pipe machen kann?

uname -a 
Linux fiatpap1d 2.4.21-63.ELhugemem #1 SMP Wed Oct 28 23:12:58 EDT 2009 i686 athlon i386 GNU/Linux 

Vielen Dank im Voraus!

+4

Sie verwenden einen 2.4-basierten Kernel? Das ist ein Teil des Problems. –

+0

Ja, ich benutze auch noch einen Plattenspieler;) Weißt du, ob eine spätere Version des Kernals den lokalen Netzwerkverkehr anders optimieren wird? – Jonathan

+0

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

Antwort

1

Ich kann Ihnen nicht auf der Java-Front helfen, aber Sie könnten sich UNIX-Domain-Sockets ansehen. Hier ist eine Frage mit Diskussion darüber, wie sie in Java verwenden:

UNIX socket implementation for Java?

+0

Ja, ich könnte etwas jni basierend verwenden. Ich würde es vorziehen, dies nicht zu tun, wenn es überhaupt möglich ist. Ich hatte gehofft, dass eine spätere Version von Linux diese Optimierung für mich tun würde. – Jonathan

1

Ihre vor Fragen stellen zwei falsche Annahmen:

  1. ICMP_ECHO (auch bekannt als Ping) liefert aussagekräftige Zeitinformationen. Es kann unter anderem nicht für die ICMP-Schicht mit niedriger Dienstpriorität sein (und sollte).
  2. Das Marshalling der Daten durch zig Java-Schnittstellen ist nicht der Flaschenhals. Denn es ist.

Ihre Testmethoden sind sehr verdächtig. Was versuchst du zu erreichen?

+0

Hölle ja. Gute Antwort. Verdammt diese zig Java-Schnittstellen und ihre Performance-Kosten. –

+0

Am 1. Ping gibt mir ~ die gleiche Zeit wie mein Test mit Named Pipes. 2. Wie sind Sie zu diesem Schluss gekommen? – Jonathan

2

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.