繁体   English   中英

C#UDPClient错误的吞吐量

[英]C# UDPClient bad throughput

我们有一个生产系统,可以从远程设备收集遥测数据。 这些数据以合理的频率发送,我们最终在高峰时间每秒接收多达数千条消息。 每个消息的有效负载约为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 /以太网头的开销可能会降低吞吐量。

另请参阅以下有关SO的文章: 无法实现1Gbit UDP吞吐量

与大数据包相比,许多小UDP数据包肯定会导致较低的网络吞吐量,但是您在计算中是否包括IP和UDP标头大小?

除此之外,每秒70k消息非常高,如果最终要部署该应用程序,那么绝对不是您希望在Internet上发生的事情。 甚至每秒成千上万条消息都很高,如果是我,我想尝试使遥测设备的通信不那么麻烦,也许是通过将多个读数捆绑到一个传输中来实现的。

如果这不是一个选择,并且您在专用网络上,并且需要提高网络吞吐量,则可能必须开始查看网卡,其驱动程序,然后对一些Windows网络参数进行微调。 但是,无论您对邮件执行什么操作,几乎都肯定会遇到瓶颈,特别是如果涉及磁盘,那么在达到70k消息/秒之前(如果您甚至可以获得当您对它们进行任何有用的操作时,速度可以达到每秒10K)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM