【问题标题】:C# UDPClient bad throughputC# UDPClient 吞吐量不佳
【发布时间】:2010-08-30 08:01:11
【问题描述】:

我们有一个从远程设备收集遥测数据的生产系统。这些数据以合理的频率发送,我们最终在高峰时间每秒收到多达数千条消息。每条消息的有效负载约为 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"; }));
    }
}

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

    大量小型 UDP 数据包肯定会导致网络吞吐量低于使用较大数据包获得的网络吞吐量,但是您是否在计算中包括了 IP 和 UDP 标头大小?

    除了 70k 消息/秒是非常非常高的,如果应用程序最终要部署在互联网上,那绝对不是您希望在互联网上发生的事情。即使每秒数千条消息也很高,如果是我,我会尝试通过将多个读数捆绑到单个传输中来尝试减少来自遥测设备的通信。

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

    【讨论】:

    • 是的,我们在现场有数十万台这样的设备,虽然我们可以对它们进行远程重新编程,但它在蜂窝通信方面的成本相当高,而且仍然是一个相当手动的过程。我正在研究的这种情况发生在我们的蜂窝提供商中断时,遥测设备将消息排队,然后当他们看到我们重新上线时立即将它们全部发送出去。这是相当罕见的,但当它发生时,我们会受到很大的打击。我们设计了自己造成的 DOS 攻击!
    【解决方案2】:

    是的,您应该使用各种有效负载大小进行测量,并查看您获得了多少吞吐量。对于小型有效负载,UDP/IP/以太网标头可能会产生开销,这可能会降低您的吞吐量。

    另请参阅以下关于 SO 的文章:Having trouble achieving 1Gbit UDP throughput

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2020-04-10
      • 2013-03-23
      • 2016-08-05
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多