Throughput erhöht sich mit grösserer Objektgrösse - Warum?

Hallo

Ich habe eine verteilte client-server-database Java Applikation basierend auf sockets geschrieben. Die Clients senden serialisierte Objekte zu den Servern (Zur Zeit habe ich 2 Server) und die Server deserialisieren die Objekte und speichern ein paar Felder der Objekte in einer postgreSQL Datenbank.

Nun habe ich mein System gebenchmarkt und ich habe die Grösse der serialisierten Objekte und den Throughput gemessen und habe dabei eine sehr komische Entdeckung gemacht, welche ich mir nicht erklären kann.

Bis zu einer Objektgrösse von ca. 1400 Bytes (oder ein bisschen weniger) nimmt der Throughput ab, aber dann von einer Objektgrösse von 1400 Bytes bis 2000 Bytes (oder ein bisschen mehr) bleibt der Throughput konstant und von einer Objektgrösse von ca. 2000 Bytes bis 2600 Bytes nimmt der Throughput wieder zu.

Ich kann mir dieses Verhalten nicht erklären. Ich dachte, dass der Throughput immer abnehmen würde mit zunehmender Objektgrösse und wenn der MTU von 1500 Bytes erreicht ist, dass dann der Throughput noch stärker abfällt. Aber dies scheint hier nicht zuzutreffen.

Hier sind die Graphen für den Throughput und die Objektgrössen:

https://drive.google.com/folderview?id=0B5qJTRYoOt78Um5LbzR4Ukg5Q00&usp=sharing

Die “message text size” ist ein Parameter (field) des Objektes, welcher ich verändere.

Ich habe die Experimente auf Amazon EC2 AMI Instanzen ausgeführt. Für jeden Server, database und client habe ich eine m3.large Instanz verwendet.

Das Protokoll ist TCP.

Bei den Amazon EC2 Instanzen habe ich ‘ip addr show eth0’ eingegeben. Die Ausgabe war:

2: eth0: mtu 9001 qdisc pfifo_fast state UP qlen 1000

D.h. die MTU ist 9001 Bytes.

Kann mir da jemand helfen?

Hast du den Netzwerkteil gebenchmarkt, oder Netzwerk+Datenbank?

Nein, das habe ich nicht gemacht. Ich habe zwar andere Benchmarks gemacht, aber nicht diese zwei.

Ich denke am Netzwerk kann es ja nicht liegen, da der Throughput da mit zunehmender Dateigrösse ja abnehmen sollte. Wenn ich das Experiment mehrmals ausführe, kriege ich das selbe Resultat, d.h. es kann auch nicht an Netzwerkvarianzen liegen.

Könnte es ander PostgreSQL Datenbank liegen? Ich extrahiere aus dem deserializierten Objekt ein String field (message text) und füge es in die Datenbank ein. Dieses String field variiere ich in der Grösse (daher wird das serialisierte Objekt grösser). Kann es sein, das in der Datenbank kleine (< 1000 Characters) und grosse Strings (> 1600 Characters) schneller eingefügt werden als die zwischendrin?

[QUOTE=Helveticus]Nein, das habe ich nicht gemacht. Ich habe zwar andere Benchmarks gemacht, aber nicht diese zwei.

Ich denke am Netzwerk kann es ja nicht liegen, da der Throughput da mit zunehmender Dateigrösse ja abnehmen sollte. Wenn ich das Experiment mehrmals ausführe, kriege ich das selbe Resultat, d.h. es kann auch nicht an Netzwerkvarianzen liegen.

Könnte es ander PostgreSQL Datenbank liegen? Ich extrahiere aus dem deserializierten Objekt ein String field (message text) und füge es in die Datenbank ein. Dieses String field variiere ich in der Grösse (daher wird das serialisierte Objekt grösser). Kann es sein, das in der Datenbank kleine (< 1000 Characters) und grosse Strings (> 1600 Characters) schneller eingefügt werden als die zwischendrin?[/QUOTE]
Könnte sein, aber ich würde noch nicht in die Richtung gehen. Normalerweise ist TCP/IP durch die ganze Welt ja vom Zeitaufwand viel mehr als der ganze andere Zeugs. Man bräuchte halt mal ein paar Anhaltspunkte, wie die Verhältnisse sind.

Öhm ist das nicht relativ logisch? Wenn du viele kleine Pakete schickst erzeugt das mehr Overhead. Wenn du wenige große Objekte in kleinere Pakete stückeln musst erzeugt das auch Overhead. Geht sich’s genau aus dass du 1 Paket pro Objekt versendest bist du am effizientesten.

Trotzdem danke für die Antwort, icdh werde den Port zum testen mal weiter offen lassen.