2017-08-08 2 views
0

Ich bin auf der Suche nach Leistung von .NET Core auf einer Linux-Box. Spezifisch sicherstellen, welche Art von Einschränkungen von Tools, die im Framework selbst verfügbar sind, sein können.Wie UDPClient Durchsatz zu erhöhen

Ich habe die Box mit ~ 50.000 pps geschlagen. Bis jetzt scheint es ~ 20.000 pps zu geben, was der UDPClient erreichen konnte, bevor einige Pakete verloren gingen. Mit einem anderen Tool (syslog-ng) gibt es eine seltene/niedrige Paketverlustrate.

Wenn ich versuche, mehr als 50K pro Sekunde zu bewältigen, kann der UdpClient das mit der richtigen Abstimmung bewältigen?

using (UdpClient udpListener = new UdpClient(_sysLogPort)) 
{ 
    udpListener.Client.ReceiveBufferSize = _bufferSize; 

    while (!_cts.IsCancellationRequested) 
    { 
     try 
     { 
      UdpReceiveResult result = await udpListener.ReceiveAsync(); 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
} 
+0

Ihre Hauptwaffe hier ist die Größe des Socket-Empfangspuffers zu erhöhen, über SO_RCVBUFSIZ, aber das zeigt sich in der API, die Sie verwenden. – EJP

+0

@EJP Ich glaube, die ReceiveBufferSize-Eigenschaft ist der Teil, der dies behandelt (ich könnte falsch liegen), aber die aktuellen Pakete sind ziemlich klein und das Pufferlimit ist viel größer als das Paket, das gerade gesendet wird. Es fühlt sich an wie ein Tuning, das ich für den UdpClient möglicherweise vermisse, da syslog-ng diesen Verkehr mit sehr wenig Überlauf verarbeiten konnte. –

+0

Wie groß ist die Paketgröße, die Sie zum Senden von Paketen an dieses Programm verwenden? Welches Tool verwenden Sie, um diese Pakete zu senden? Welchen Prozessortyp verwenden Sie? Können Sie bestätigen, dass Sie die Loopback-Schnittstelle verwenden (dh, der Sender und Ihr Programm befinden sich auf demselben Linux-Host)? Welche Version von dotnet verwendest du, auf deiner Linux-Box: 1.0.4, älter, aktueller? –

Antwort

1

Selbst wenn Ihre App einen neuen Thread mit udpListener.ReceiveAsync(); startet, wartet er für seine Kündigung vor ein neues Paket zu erhalten versuchen. Es gibt also immer nur einen Thread, der ein neues empfangenes UDP-Paket behandelt, um ein Objekt vom Typ UdpReceiveResult zu erstellen. Also, es ist ähnlich wie eine single-threaded App: Sie tun nicht nutzen Sie die Möglichkeit, auf einem Multi-Core-System zu laufen.

Sie können bessere Preise erhalten (abhängig von Ihrer Hardware, offensichtlich), mit der folgenden Weise, Ihr Programm zu schreiben. In diesem Beispiel gibt es einen Pool von 5 Threads, die parallel ausgeführt werden, um mehrere Instanzen von UdpReceiveResult gleichzeitig zu erstellen. Selbst wenn Pakete vom Kernel einzeln behandelt werden, wird der Benutzerlandprozess zum Erstellen von Instanzen von UdpReceiveResult parallel mit dieser Art der Programmierung durchgeführt.

// example of multithreaded UdpClient with .NET core on Linux 
// works on Linux OpenSuSE LEAP 42.1 with .NET Command Line Tools (1.0.4) 
// passed tests with "time nping --udp -p 5555 --rate 2000000 -c 52000 -H localhost > /dev/null" 

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 

namespace hwapp { 
    class Program { 
    // listen to port 5555 
    UdpClient udpListener = new UdpClient(5555); 

    static void Main(string[] args) { 
     Program p = new Program(); 
     // launch 5 threads 
     Task t0 = p.listen("thread 0"); 
     Task t1 = p.listen("thread 1"); 
     Task t2 = p.listen("thread 2"); 
     Task t3 = p.listen("thread 3"); 
     Task t4 = p.listen("thread 4"); 
     t0.Wait(); t1.Wait(); t2.Wait(); t3.Wait(); t4.Wait(); 
    } 

    public async Task listen(String s) { 
     Console.WriteLine("running " + s); 
     using (udpListener) { 
     udpListener.Client.ReceiveBufferSize = 2000; 
     int n = 0; 
     while (n < 10000) { 
      n = n + 1; 
      try { 
      UdpReceiveResult result = udpListener.Receive(); 
      } catch (Exception ex) {} 
     } 
     } 
    } 
    } 
} 
Verwandte Themen