4

我正在尝试测量 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

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

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

4

2 回答 2

1

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

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

于 2012-04-16T12:55:02.673 回答
0

我终于能够弄清楚并解决这个问题:-)
正如我在问题中提到的,无论我使用什么网络架构(本地主机、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)。所以这项工作完全符合我的预期。所以我的做法是正确的。完美的 !!

于 2012-04-18T07:36:45.480 回答