使用C++测量网络上 2 个应用程序之间的数据传输速率(带宽),如何获得公正准确的结果

Measure data transfer rate (bandwidth) between 2 apps across network using C++, how to get unbiased and accurate result?

本文关键字:带宽 何获得 结果 公正 数据 网络 测量 C++ 使用 之间 应用程序      更新时间:2023-10-16

我正在尝试测量 2 个模拟应用程序(用 C++ 编写)之间的 IO 数据传输速率(带宽)。我创建了一个非常简单的perfclient和perfserver程序,只是为了在实际应用程序中实现此计算方法之前验证我计算网络带宽的方法是否正确。所以在这种情况下,我需要以编程方式执行此操作(不使用 Iperf)。

我尝试在各种域(本地主机,连接到以太网的计算机和连接到无线连接的计算机)上运行我的perfclient和perfserver程序。但是,我总是在这些不同的主机上获得相似的带宽,大约 1900 Mbps(使用 1472 字节的数据大小进行测试)。这是一个合理的结果,还是我可以获得更好、更准确的带宽?

我是否应该使用 1472(这是以太网 MTU,不包括标头)作为每个 send() 和 recv() 的最大数据大小,为什么/为什么不?我还尝试使用不同的数据大小,这是我获得的平均带宽(使用以太网连接进行测试),这对我来说没有意义,因为数字超过了 1Gbps 并达到了 28 Gbps 之类的速度。

SIZE    BANDWIDTH
1KB     1396 Mbps
2KB     2689 Mbps
4KB     5044 Mbps
8KB     9146 Mbps
16KB    16815 Mbps
32KB    22486 Mbps
64KB    28560 Mbps

这是我目前的方法:
我做了一个基本的乒乓时尚循环,客户端不断向服务器程序发送字节的数据流。服务器将读取这些数据,并将数据反射(发送)回客户端程序。然后,客户端将读取这些反射的数据(2 路传输)。上述操作重复 1000 次,然后将时间除以 1000 得到平均延迟时间。接下来,我将平均延迟时间除以 2,得到 1 路传输时间。然后可以按如下方式计算带宽:

bandwidth = total bytes sent / average 1-way transmission time

我的方法有什么问题吗?如何确保我的结果没有偏差?一旦我做对了,我将需要在我原来的应用程序(而不是这个简单的测试应用程序)中测试这种方法,我想把这个性能测试结果放在一篇科学论文中。

编辑:我已经解决了这个问题。看看我在下面发布的答案。

除非你需要重新发明轮子,否则iperf就是为了解决这个问题而制作的。

Iperf由NLANR/DAST开发,作为测量最大TCP和UDP带宽性能的现代替代方案。Iperf 允许调整各种参数和 UDP 特性。Iperf 报告带宽、延迟抖动、数据报丢失。

我终于能够弄清楚并解决这个问题:-)
正如我在问题中提到的,无论我使用的网络架构(本地主机、1Gbps 以太网卡、无线连接等),我实现的带宽都扩展到高达 28Gbps。我尝试将服务器 IP 地址绑定到几个不同的 IP 地址,如下所示:

127.0.0.1  
IP address given by my LAN connection  
IP address given by my wireless connection

所以我认为这应该给我正确的结果,事实上它没有。这主要是因为我在同一台计算机上运行客户端和服务器程序(不同的终端窗口,即使客户端和服务器都绑定到不同的 IP 地址)。我的猜测是这是由内部环回引起的。这是结果如此偏颇和不准确的主要原因。

无论如何,所以我随后尝试在一个工作站上运行客户端,在另一个工作站上运行服务器,并使用不同的网络连接测试它们,它按预期工作:-)
在1Gbps连接上,我得到了大约9800 Mbps(0.96 Gbps),而在10Gbps的连接上,我得到了大约10100 Mbps(9.86 Gbps)。所以这完全符合我的预期。所以我的方法是正确的。完善!!