我正在研究.NET Core在linux系统上的性能。特别是要确定框架本身中可用的工具可能会有什么样的限制。
我已经用大约50000 pps击中了盒子。到目前为止,UDPClient在丢弃相当一部分数据包之前能够达到大约20000 pps的速度。使用另一个工具(syslog ng)时,数据包丢失率很少/很低。
如果我希望处理超过5万pps的数据,UdpClient是否能够通过适当的调整来处理这个问题?

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

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

        }
    }
}

最佳答案

即使你的应用程序使用udpListener.ReceiveAsync();启动一个新线程,它也会在尝试接收新数据包之前等待其终止。因此,一次只有一个线程处理新接收到的UDP数据包,以创建udpreciveresult类型的对象。因此,它相当类似于一个单线程应用程序:你不能利用在多核系统上运行的机会。
你可能会得到更好的速率(显然,取决于你的硬件),用下面的方法来编写你的程序。在本例中,有一个由5个线程组成的池,这些线程并行运行以同时创建多个udpreciveresult实例。即使包是由内核一次一个地处理的,创建udpreciveresult实例的userland过程也是以这种编程方式并行完成的。

// 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) {}
        }
      }
    }
  }
}

10-06 01:57