Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Kleine Pakete langsamer? (https://www.delphipraxis.net/78661-kleine-pakete-langsamer.html)

Thanatos81 9. Okt 2006 08:04


Kleine Pakete langsamer?
 
Moin zusammen!

Wir bauen hier gerade ein Programm im Client-Server-Prinzip mit Indy. Um abschätzen zu können was für Zeiten wir später erzielen haben wir einen Belastungstest gefahren. Der war wie folgt aufgebaut: Client schickt einen Header (Record) von 9 Byte und dann einen in der Größe variablen Stream. Der Server vaerarbeitet die Daten und schickt eine Antwort zurück, danach schickt der Client erneut das Datenpaket und den Header. Das ganze lassen wir eine Minute laufen.

Seltsamerweise konnten wir mit Streams von ca. 30 KByte ungefähr 1900 Aufgaben und Antworten verschicken. Bei einer Streamgröße von 20 Byte bekommen wir allerdings nur 275 Pakete und Antworten durch hin. Wir haben bei der Client-Komponente die SendBufferSize auch dementsprechend angepasst, das macht allerdings nicht ein Paket Unterschied.

Hatte jemand schon mal ein ähnliches Phänomen und vielleicht sogar eine Lösung?

Danke Im Vorraus,
Thomas

Muetze1 9. Okt 2006 09:50

Re: Kleine Pakete langsamer?
 
Könnte es daran liegen wie Windows die Daten zusammenfasst zu einem Packet auf der untersten OSI Schicht? Schliesslich sendet er nicht sofort wegen einem Byte ein Packet sondern vorher kommen auf den obersten OSI Schichten noch Buffer die gefüllt werden und dann etweder zeitlich - oder vorher durch die Füllung - versendet werden. Dadurch werden auch Packet zusammengefasst und als Einheit verschickt. Könnte dies hier zu Buche schlagen?

sakura 9. Okt 2006 09:51

Re: Kleine Pakete langsamer?
 
Zitat:

Zitat von Muetze1
Könnte dies hier zu Buche schlagen?

Ja. Wenn ich mich recht entsinne waren es 512 Bytes oder so, bevor Windows diese sofort versendet. @Thanatos81: Einfach mal die Grenze testen ;)

...:cat:....

Thanatos81 9. Okt 2006 10:00

Re: Kleine Pakete langsamer?
 
Ja, auf den Trichter bin ich inzwischen auch schon gekommen und da liegt der Hund wirklich begraben. Abhilfe lässt sich angeblich per
Delphi-Quellcode:
IdTCPClient1.Socket.Binding.SetSockOpt(ID_SOL_SOCKET, Id_SO_SNDBUF, optval, optlen);
schafffen. Allerdings bekomme ich dann immer:
Zitat:

---------------------------
Gateway
---------------------------
Socket-Fehler # 10014

Falsche Adresse.
---------------------------
OK
---------------------------
Also wollte ich erstmal die aktuellen Werte auslesen und dann neu setzen:
Delphi-Quellcode:
         
if IdTCPClient1.Socket.Binding <> nil then
  begin
    optlen := SizeOf(integer);
    IdTCPClient1.Socket.Binding.GetSockOpt(id_sol_socket,id_so_sndbuf,optval, optlen);
    optval := PChar(29); //29 = Datensatz (20) + Footer (9)
    IdTCPClient1.Socket.Binding.SetSockOpt(ID_SOL_SOCKET, Id_SO_SNDBUF, optval, optlen);
  end;
Da bekomme ich die Fehlermeldung allerdings schon beim GetSockOpt :(

Thanatos81 9. Okt 2006 14:45

Re: Kleine Pakete langsamer?
 
So, anstatt die Länge der Datenpakete jedes Mal zu setzen, mache ich nun folgendens:
Delphi-Quellcode:
if IdTCPClient1.Socket.Binding <> nil then
  IdTCPClient1.Socket.Binding.SetSockOpt(Id_IPPROTO_TCP, Id_TCP_NODELAY, PChar(0), 1);
Dadurch wird einfach eingestellt, dass nicht gewartet werden soll, bis das Paket voll ist. Ergebnis: Von den kleinen Paketen verschicken wir jetzt ca. 78.000 Pakete/Min. So viel wird zwar nie benötigt werden, aber man kann den Kunden beruhigen, dass er so schnell nicht gegen die Wand fahren wird ;-)

Danke Muetze und sakura für eure Posts und auch allen anderen die sich den Kopf zerbrochen haben :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz