C#UDPClient吞吐量不佳

我们有一个生产系统,可以从远程设备收集遥测数据.这些数据以合理的频率发送,我们最终在高峰时间每秒接收数千条消息.每个消息的有效负载大约为80字节.我开始对各种存储机制进行一些性能测试,但我想首先我会尝试看看有多快我可以推送UDP而不涉及任何数据存储.我在本地计算机上进行第二次最大吞吐量测试时得到大约70,000条消息(如果我使用另一台机器发送测试数据,似乎大致相同).从粗略的计算来看,这比我预期的网络链路容量要低.发件人坐在发送数据的紧密循环中.我完全了解UDP re的所有问题;丢包等等我只是想了解一下我们系统的弱点.

由于数据包的大小,吞吐量是否如此之低?

马特

private IPEndPoint _receiveEndpoint = new IPEndPoint(IPAddress.Any, _receivePort);
private Stopwatch sw = new Stopwatch();
private int _recievedCount = 0;
private long _lastCount = 0;
private Thread _receiverThread;
private bool _running = true;

_clientReceive = new UdpClient();
_clientReceive.Client.Bind(_receiveEndpoint);
_receiverThread = new Thread(DoReceive);
_receiverThread.Start();

  while (_running)
  {
    Byte[] receiveBytes = _clientReceive.Receive(ref _receiveEndpoint);

    _clientReceive.Receive(ref _receiveEndpoint);
    if (!sw.IsRunning)
      sw.Start();
    string receiveString = Encoding.ASCII.GetString(receiveBytes);
    _recievedCount = ++_recievedCount;
    long howLong = sw.ElapsedMilliseconds;
    if (howLong/1000 > _lastCount)
    {
      _lastCount = howLong/1000;
      Invoke(new MethodInvoker(() => { Text = _recievedCount + " iterations in " + sw.ElapsedMilliseconds + " msecs"; }));
    }
}

最佳答案 很多小型UDP数据包肯定会导致网络吞吐量低于您使用较大数据包时的网络吞吐量,但是您是否包含IP和IP数据包.计算中的UDP标头大小?

除了70k消息/秒非常高,绝对不是你想要在互联网上发生的事情,如果这是应用程序最终将被部署的地方.甚至成千上万的消息/秒也很高,如果是我的话,我会试着通过将多个读数捆绑到单个传输中来尝试使遥测设备的通信不那么繁琐.

如果这不是一个选项,并且您在专用网络上并且需要增加网络吞吐量,则可能必须开始查看您的网卡,其驱动程序,然后微调一些Windows网络参数.但无论你对这些消息做什么,你几乎肯定会对你对它们所做的任何处理都有所了解,特别是如果它涉及磁盘,那么在你获得70k消息/秒之前(如果你甚至可以得到它,我会感到惊讶)当你对它们做任何有用的事情时,要达到10K /秒).

点赞