我正在尝试测量 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
我的方法有什么问题吗?如何确保我的结果没有偏见?一旦我做对了,我将需要在我的原始应用程序(而不是这个简单的测试应用程序)中测试这种方法,并且我想把这个性能测试结果放在一篇科学论文中。
编辑: 我已经解决了这个问题。查看我在下面发布的答案。