C++ gSoap => Netzwerkgeschwindigkeit lahm
-
Hallo zusammen
Ich habe einen Windows Service, welcher einen Soap Server-Dienst zur Verfügung stellt (gSoap). Falls sich ein Client anmeldet, kann dieser Beispielsweise grosse Datenmengen anfordern (>500MB), welche dann via Soap abgepackt zurück zum CLient kommen, welcher dann wiederum die Datenmengen in ein HDF5 File abpackt.
Passiert das ganze lokal auf dem eigenen Computer (Client = localhost ; Server = localhost), dann habe ich eine gute Lesegeschwindigkeit (etwa 40-60 MB).
Falls nun der Client auf einem anderen Rechner auf den Server zugreift, so ist die Lesegeschwindigkeit limitiert auf die Netzwerkgeschwindigkeit (100 MBit). Jedoch bekomme ich etwa von den 100MBit nur 4 MB Datendurchsatz. Dass ist nicht akzeptabel, da die Daten wirklich sehr gross werden können (5 GB). Dann würde das kopieren eine Weile dauern.
Dann habe ich mich gefragt, wo das Problem stecken könnte. Da muss es noch tunings Möglichkeiten an der SOAP Schnittstelle geben. Der Internetlink http://www.cs.fsu.edu/~engelen/soapdoc2.html#sec:chunked gibt da einen Ratschlag, welcher unter dem Kapitel "Speed improvement tips" zu finden ist. Dort wird vorgeschlagen, dass man den Buffer erhöht. Diesen habe ich dann Beispielsweise auf 6 MB erhöht. Beim nochmaligen Versuchen bekomme ich tatsächlich einen höheren Datendurchsatz von etwa 6 MB. Danach habe ich laufend den Buffer erhöht, leider ging aber der Datendurchsatz nicht höher als diese 6 MB. Die anderen Tips haben mir bis jetzt auch noch nichts geholfen.
Darum kann mir jemand noch andere Tips geben welche mich auf den richtigen Pfad leiten. Woher könnte diese Limitierung kommen? Da es ja lokal über die selbe Schnittstelle sehr schnell funktioniert, muss es da ein Problem geben, welche SOAP & Remote Clients betrifft. Jemand ne Ahnung?Mit freundlichen Grüssen
-
Werden die großen Datenmengen als Attachment (MTOM) geschickt oder in das XML verpackt? Bei letzterem könnte ich mir vorstellen, dass die Serialisiererei schwer bremst.
-
Danke für den Hinweis. Ich muss dies genauers analysieren, da ich selber die Schnittstelle nicht erstellt habe. Ich habe mich ein wenig schlau gemacht über MTOM und es hört sich an, ob dass vielleicht ne Lösung ist falls eben die Daten als XML serialisiert werden (Base64), da diese vielmehr Platz beanspruchen.
Ich konnte jedoch trotzdem einen Effekt beobachten beim stetigen erhöhen des Buffers. Wenn man den Netzwerktraffic via TaskManager sich genauer ansieht so zeigt sich dass etwa ab einer Buffer grösse von 4 MB die Netzwerkauslastung in einem 100 MBit Netz am besten ist (liegt im Mittel bei 70%). Steigt der Buffer so habe ich teilweise heftige Ausschläge von bis zu 98%, jedoch gehen die immer wieder bis auf 25% zurück. Stellt man sich das bildlich vor so hat man bei stetig höherem Buffer eine Art Zick Zack welcher zwischen 20-98 % stetig ab und auf geht. Im Durchschnitt ist man dann eben trotzdem langsamer (etwa 55%).
Das Problem ist leider, wenn ich eine 1Gbit Leitung benutze, wird dort trotzdem nur 10% der Bandbreite ausgenutzt. Irgendetwas bremst ganz böse!Ich werde deinen Ratschlag mit MTOM morgen genauers analysieren und wieder bescheid geben.
Mit freundlichen Grüssen
-
Danke für den Hinweis. Ich muss dies genauers analysieren, da ich selber die Schnittstelle nicht erstellt habe.
Was ich weiss, ist dass die gSoap-Schnittstelle das DIME Format verwendet, um Daten zu kapseln. So wie ich das verstehe, ist das auch eher gedacht für binäre Daten. Daher sollte doch eigentlich dies funktionieren?Ich konnte jedoch trotzdem einen Effekt beobachten beim stetigen erhöhen des Buffers. Wenn man den Netzwerktraffic via TaskManager sich genauer ansieht so zeigt sich dass etwa ab einer Buffer grösse von 4 MB die Netzwerkauslastung in einem 100 MBit Netz am besten ist (liegt im Mittel bei 70%). Steigt der Buffer so habe ich teilweise heftige Ausschläge von bis zu 98%, jedoch gehen die immer wieder bis auf 25% zurück. Stellt man sich das bildlich vor so hat man bei stetig höherem Buffer eine Art Zick Zack welcher zwischen 20-98 % stetig ab und auf geht. Im Durchschnitt ist man dann eben trotzdem langsamer (etwa 55%).
Das Problem ist leider, wenn ich eine 1Gbit Leitung benutze, wird dort trotzdem nur 10% der Bandbreite ausgenutzt. Irgendetwas bremst ganz böse!Mit freundlichen Grüssen
-
Leider habe ich gerade zu dem MTOM Vorschlag folgendes gefunden (http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc16):
Unlike the name MTOM suggests, the speed by which attached data is transmitted is not increased compared to MIME, DIME, or even XML encoded base64 data (at least the performance differences in gSOAP will be small). The advantage of the format is the standardized attachment reference mechanism, which should improve interoperability.
Daher stehe ich wieder am anfang... Irgendwelche andere Ratschläge?
-
Man möge sich merken: Alles mit "soap" oder "bean" ist lahm!
-
Momentan verwendet unser Service die gSOAP Version 2.7.12. Das DIME Sample aus dem GSoap Ordner leistet sehr gute Durchsatzraten:
100 MBit -> 12 MB/s
1 GBit -> 80 MB/s (Je nach Hardware)Der Fehler liegt wohl in der Software wo die Daten für das Streaming bereit gestellt werden.
Mit freundlichen Grüssen