![]() |
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 |
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?
|
Re: Kleine Pakete langsamer?
Zitat:
...:cat:.... |
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:
schafffen. Allerdings bekomme ich dann immer:
IdTCPClient1.Socket.Binding.SetSockOpt(ID_SOL_SOCKET, Id_SO_SNDBUF, optval, optlen);
Zitat:
Delphi-Quellcode:
Da bekomme ich die Fehlermeldung allerdings schon beim GetSockOpt :(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; |
Re: Kleine Pakete langsamer?
So, anstatt die Länge der Datenpakete jedes Mal zu setzen, mache ich nun folgendens:
Delphi-Quellcode:
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 ;-)
if IdTCPClient1.Socket.Binding <> nil then
IdTCPClient1.Socket.Binding.SetSockOpt(Id_IPPROTO_TCP, Id_TCP_NODELAY, PChar(0), 1); 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