使用C ++测量网络上2个应用之间的数据传输速率(带宽),如何获得无偏见且准确的结果?

时间:2012-04-16 11:49:39

标签: c++ performance sockets network-programming bandwidth

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

我尝试在各种域上运行我的perfclient和perfserver程序(localhost,连接到以太网的计算机和连接到无线连接的计算机)。但是,我总是在每个不同的主机上获得相似的带宽,大约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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

除非你需要重新发明轮子iperf才能解决这个问题。

  

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

答案 1 :(得分:0)

我终于能够想出并解决这个问题:-)
正如我在问题中提到的,无论我使用的网络架构(localhost,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)。所以这项工作完全符合我的预期。所以我的方法是正确的。完美!!