gpt4 book ai didi

C# UDPClient 不良吞吐量

转载 作者:行者123 更新时间:2023-11-30 12:36:19 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com