C# UDPClient 不良吞吐量

标签 c# sockets

我们有一个从远程设备收集遥测数据的生产系统。此数据以合理的频率发送,我们最终在高峰时段每秒接收多达数千条消息。每条消息的有效负载约为 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 和 UDP header 大小?

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

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

关于C# UDPClient 不良吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3597062/

相关文章:

C# 命名空间 : how to follow standards without causing annoying conflicts?

c# linq xml 如何为同一个命名空间使用两个前缀

c# - Lambda 表达式 Compile() 方法有什么作用?

c# - 当仍有大量可用内存时抛出“System.OutOfMemoryException”

c++ - 使用数据包套接字在同一网络接口(interface)上发送和接收时无法接收数据包

linux - 当套接字没有指定源IP地址时,Linux如何选择IP地址?

c# - 如何在我的自定义表而不是 aspnet 用户中保存带有散列密码的新记录?

c++ - 如何将网络数据反序列化为不同的原语?

java - 在 RxJava 中同时从 Socket 读取和写入

javascript - 使用 npm test 进行 sails.socket 测试