Wenn Nachrichten größer werden, wird IpcChannel Remoting langsamer

9

Ich evaluiere verschiedene Interprozess-Kommunikationsmethoden für einige .NET 2.0 Prozesse, die sich auf demselben Rechner befinden . Natürlich ist .Net Remoting ein Kandidat, und theoretisch sollte die schnellste Konfiguration IpcChannel (Named Pipes) + BinaryFormatter sein.

Meine Benchmarks zeigen wirklich, dass Remoting über IpcChannel meist schneller sein kann als TcpChannel, aber IpcChannel zeigt einen steilen Abfall im Durchsatz, wenn Nachrichten größer werden (etwa 30 MB):

%Vor%

Hat jemand eine Idee warum oder irgendeine Idee, wie man die Leistung beider Kanäle optimiert? Ich muss 30 MB BLOBs herumreichen und möchte vermeiden, dass ich mit Shared Memory / Memory-Mapped-Dateien umgehen muss. Außerdem kann ich mir nicht leisten, diese auf die Festplatte zu schreiben (viel langsamer).

Die folgende Methode wurde für die Benchmarks verwendet (wiederholt aufgerufen, gemessene Gesamtzeit, geteilte Gesamtanzahl Nutzlast nach Gesamtzeit).

%Vor%     
Yodan Tauber 02.12.2010, 12:26
quelle

3 Antworten

1

Eine Waffe, die kleiner ist als der geteilte Speicher, aber immer noch leistungsfähig genug für den Job, wäre Sockets. Lassen Sie bei der Ausführung der Remote-Prozedur einen Listen ing-Socket auf einer festen oder Ad-hoc-Portnummer erstellen, stellen Sie eine Verbindung vom Client her her und verwenden Sie NetworkStream , um Daten von einer Seite auf eine andere zu schreiben.

Es wird wie ein Zauber wirken, da bin ich mir sicher.

Dieser Artikel sollte Ihnen den Einstieg erleichtern.

Und obwohl Sie nichts über Server und Client auf separaten Rechnern erwähnen, haben Sie immer noch diese Fähigkeit, die verschwinden wird, wenn Sie Shared Memory verwenden.

    
Daniel Mošmondor 19.12.2010, 08:26
quelle
1

Warum möchten Sie den gemeinsamen Speicher vermeiden? Es ist die naheliegendste Wahl für das Verschieben großer BLOBs.

    
zvrba 12.12.2010 19:45
quelle
1

Das "seltsame" Verhalten für große Nachrichtengrößen (30MB) beruht sicherlich auf GC-Druck. Übrigens sollte BinaryFormatter der langsamste aller möglichen Formatierer sein. DataContractFormatter könnte viel besser sein oder eine Handschrift wie diese Schönheit Ссылка sollte etwa 16 mal schneller sein. Wie hast du die Zeiten gemessen? War der Sende- und Empfangsprozess derselbe? Ich denke, 120 MB / s senden empfangen sind ziemlich gut für .net mit einem sehr beschäftigten Müllsammler. Sie sollten sich den% GC Time Performance-Zähler ansehen, um zu überprüfen, ob er hoch ist. Wenn es & gt; 95% sollten Sie den Speicher sparsamer nutzen. Andere Kommentatoren haben bereits darauf hingewiesen, dass Speicherkarten die richtige Wahl darstellen, wenn große Datenmengen zwischen Prozessen ausgetauscht werden müssen. Es gibt viele kostenlose Implementierungen wie

  

Ссылка

und

  

Ссылка   (Smart Client Offline-Anwendung   block hat eine dll, die a enthält   nette Umsetzung).

Mit freundlichen Grüßen   Alois Kraus

    
Alois Kraus 12.12.2010 23:14
quelle

Tags und Links