Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailslots (https://www.delphipraxis.net/20062-geschwindigkeit-anonymous-pipes-vs-named-pipes-vs-mailslots.html)

Arakis 13. Apr 2004 08:51


Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailslots
 
Ich habe einen Serverprozess mit bis zu ca. 10 Clientprozessen, auf dem selben Computer am laufen. Es soll eine extrem hohe(!) Kommunikation in Form vom Nachrichten von 30-1000 Bytes stattfinden. Alle Prozesse haben KEIN Window.

Ein paar Geschwindigkeitsmessungen auf einem AMD 1,3 Ghz, Windows XP:
Windowsmessages von per PostThreadMessage():
ca. 150.000 Messages pro Sekunde
ca. 50.000 Messages pro Sekunde mit Warten auf Antwort

Faziz: Sehr schnell, kann aber "nur" zwei 32-Bit-Zahlen transportieren


Memory Mapped Files(Shared Memory)
Es gibt für jede Sprachrichting eine Memory Mapped File, zu sendende Daten werden hinein geschrieben und eine Windowsmessage gesendet mit Offset und Länge des Datenpacketes in der Remote-Datei um den Remoteprozess über ein neues Datenpacket zu benachrichtigen
ca. 12.000 Nachrichten(Länge 20-100 Bytes) pro Sekunde mit Warten auf Antwort
Wie lange das Senden ohne zu Warten dauert habe ich "vergessen"
Problematiken: Die "selbstgeschribene" Pipeline muss regelmäßig rotiert bzw. geleert werden.

Anomymous Pipes
2 Pipes, eine für jede Richtung. Auf beiden Seiten wird mit Hilfe von ReadFile() "gelauscht". Eine Zeitmessung habe ich noch nicht durchgeführt. Etwas anderes macht mir da "mehr" Sorgen: Serverseiting wird für jeden Client ein sperater Thread benötigt, da ReadFile() sich auf nur ein File-Handle bezieht.

Named Pipes
Ist mir ne Nummer zu "hoch", und meine Bedenken sind dass Named Pipes einen zu großen "Overhead" haben.

Mail Slots
Nachriten basiertes System. Vorteil: Es sind Broatcast-Nachrichten möglich. Nachteil: Es wird NICHT garantiert dass das Packet angekommen ist.


In meiner Anwenund gibt es folgende Nachrichtentypen:
Send Only
Beispiel: Ein Protokollierungseintrag wird abgeschickt, Der Client arbeitet sofort weiter, eine Benachrichtigung ob Erfolgreich ist nicht notwenidg
Mein Vorschlag zu Realisierung: Mail Slot oder Anonymouse Pipe in einer Richting.

Send And Notify
Beispiel: Der Client aktualisiert einen Wert auf dem Server. Als Benachrichtigung nach der Aktualisierung wäre eine Windowsmessage denkbar.

GetData
Beispiel: Ein Wert wird abgefragt. Die Anfrage wird gestellt(ca. 20-100 Bytes), es wird gewartet bis der Server Antwortet.
Mein Vorschlag zur Realisierung: zwei Anoymous Pips oder eine Named Pipe, Mail Slot oder Memory Mapped File mit windowsmessage-Benachrichtigung


Die Wahl der Transportmöglichkeit ist durch folgende Dinge zu überlegen:
- Transportgeschwindigkeit
- Effizienz beim Abfragen der ankommenden Daten

Da ich in der Regel immer in 2 Richtiungen kommunizieren muss("Send Only" ist extrem seltend, daher mache ich mir darüber jetzt keine Gedanken) ist die Situation folgende:
Die Lösung mit Memory Mapped Files-Lösung benötigt auf der Clientseiete eine MMF und eine Messagequeue, auf Serverseite ebenfalls. Auf Serverseite jedoch könnte ein einziger Thread(MessageQueue) an mehreren Verbindungen lauschen.

Für Anomous Pipes wird IMMER pro Sprachrichtung ein Thread zum lauschen benötigt.

Named Pipes sind mir ne Nummer zu "hoch"

Mit Mailslots habe ich noch nicht gearbeitet.

Nächste Problematik wäre dann das Bearbeiten der Packete auf der Serverseite. Ich bin am überlegen ob für jede Anfrage geschaut werden soll wie "zeitaufwendig" sie ist. Ist sie vorraussichtilich "zeitaufwendig" soll sie in einem neuen Thread bzw. in einem Thread im Threadpool ausgeführt werden.

Nun, was ist die schnellste und effzienteste Lösung?
Mir fehlt es halt ein bisschen an Erfahrung bei der "High Performance" Inter Process Communikation ;)

Ist als "Benachrichtiung" ein WaitHandle bzw. Event(per Handle) schneller/effizienter als eine Windowsmessage?

Gibt es eigentlich 3rd-Party Lösungen für IPC?

sakura 13. Apr 2004 09:04

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
Named Pipes sind merklich langsamer. Für Messages mit 4KB Größe hast Du im Schnitt einen Durchsatz von 10.000 Nachrichten je Sekunde bei ca. 80% Prozessorauslastung (Worst-Case-Scenario!). Selbst das sollte aber eigentlich reichen. In Momenten mit solch einem Datendurchsatz sollte man das Design seiner Software überprüfen und mehrere Datenmengen bündeln ;)

Getestet mit folgenden Komponenten: http://www.delphipraxis.net/internal...?p=36961#36961 (Nicht auf Geschwindigkeit optimiert und nach jeder Verbindung wurde diese wieder automatisch geschlossen! Wenn man die Verbindung offen hält, dann kann man einen deutlich höheren Durchsatz erreichen.

...:cat:...

sakura 13. Apr 2004 09:07

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
Nachtrag: Mail Slots sind ca. 30% schneller als Named Pipes aber haben den von Dir genannten Nachteil, daß die Übertragung der Nachrichten nicht garantiert ist.

...:cat:...

Arakis 13. Apr 2004 09:29

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
Wie steht es mit Performance Anonymous Pipes vs Named Pipes?

Hier gibt es zwar ne Menge Infos, aber leider keine Konkrete Aussage zur Geschwindigkeit:
http://msdn.microsoft.com/library/de...unications.asp

kiar 13. Apr 2004 09:43

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
hallo ,


habe mal was gelesen, das es auch first Class mailslots gibt, die einen garantierten verbindungsorientierten Nachrichtenaustausch machen.

nur die second class mailslots garantieren keine nachrichtenübermittlung. :gruebel:

raik

sakura 13. Apr 2004 09:44

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
Kann ich leider auch nicht sagen - mit denen habe ich noch nicht gearbeitet ;) Hilft nur selber testen.

...:cat:...

Arakis 13. Apr 2004 10:14

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
Hm, Mailslots 30% schneller...hört sich gut an. Aber: Wenn ich nun eine eigene Benachrichtiung einbauen würde, würden dann 30% verlohren gehen?

Vorgehensweise:
Code:
Sendender Thread auf Client:
Packet Senden
WaitForSingleObject()

Empfangender Thread auf Server:
Packet abfragen
Client entsperren(Waithandle ist im Packet enthalten)
Mal ne andere Frage: Kann ein Packet lokal überhaupt verlohren gehen? :mrgreen:
Wieviel Messages(Packete) kann ein Mailslot speichern?

Wie fragt man Messages "effizent" ab? Also per Timer schon mal "sehr" schlecht ;)
Sollte der Server per WaitHandle informiert werden? Per Windowsmessage? Oder verweilt ReadFile() so lange bis eine neue Nachricht da ist?

sakura 13. Apr 2004 10:19

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
Zitat:

Zitat von Arakis
Hm, Mailslots 30% schneller...hört sich gut an. Aber: Wenn ich nun eine eigene Benachrichtiung einbauen würde, würden dann 30% verlohren gehen?

Nach Milchmädchenrechnung würdest Du dadurch 40% verlieren ;)

Zitat:

Zitat von Arakis
Mal ne andere Frage: Kann ein Packet lokal überhaupt verlohren gehen? :mrgreen:

Gute Frage, nächste Frage. Ich denke mal ja.

Zitat:

Zitat von Arakis
Wieviel Messages(Packete) kann ein Mailslot speichern?

Wieder eine gute Frage... Ich glaube bis der RAM/Swap voll ist.

Zitat:

Zitat von Arakis
Wie fragt man Messages "effizent" ab? Also per Timer schon mal "sehr" schlecht ;)

Stimmt, Timer ist miserabel und langsam.

Zitat:

Zitat von Arakis
Sollte der Server per WaitHandle informiert werden? Per Windowsmessage? Oder verweilt ReadFile() so lange bis eine neue Nachricht da ist?

Schau mal in die Komponenten von oben, nach dem Schema solltest Du da schon vorgehen. (Auch mit WaitHandle).

...:cat:...

kiar 13. Apr 2004 10:25

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
vielleicht mal als denkanstoss:
http://www.entwickler-forum.de/WebX?...avZ.4@.ee6d93f


raik

Arakis 13. Apr 2004 10:50

Re: Geschwindigkeit Anonymous Pipes vs Named Pipes vs Mailsl
 
Zitat:

Gute Frage, nächste Frage. Ich denke mal ja
oh gott, schrecklich! Ich sehe es schon vor mir: "Ich habe Waren zu meinem Planeten gebeamt aber sie sind nicht angekommen! - Ich habe auf einem auf ein Schiff geschossen aber die Hülle ist nicht weniger geworden." Ach ja, wer sich für meine Anwendung interessiert: www.stne.net ;)

Also ich muss den Server benachritigen wenn neue Daten da sind um effizent antworten zu können, und der Server muss den Empfang auch noch bestätigen...daher stellt sich die Frage ob Anonymous Pipes bzw. Named Pipes da nicht schneller sind.

Zitat:

Schau mal in die Komponenten von oben, nach dem Schema solltest Du da schon vorgehen. (Auch mit WaitHandle).
wo?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr.
Seite 1 von 2  1 2      

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