all*_*ace 5 c++ sockets performance network-programming bandwidth
我正在尝试测量 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
Run Code Online (Sandbox Code Playgroud)
这是我当前的方法:
我做了一个基本的乒乓时尚循环,其中客户端不断向服务器程序发送数据流字节。服务器将读取这些数据,并将数据反映(发送)回客户端程序。然后客户端将读取这些反射数据(2 路传输)。上述操作重复1000次,然后我将时间除以1000以获得平均延迟时间。接下来,我将平均延迟时间除以 2,得到 1 路传输时间。带宽可以计算如下:
bandwidth = total bytes sent / average 1-way transmission time
Run Code Online (Sandbox Code Playgroud)
我的做法有什么问题吗?我怎样才能确保我的结果没有偏见?一旦我做到了这一点,我将需要在我的原始应用程序(不是这个简单的测试应用程序)中测试这种方法,并且我想将此性能测试结果放入科学论文中。
编辑: 我已经解决了这个问题。查看我在下面发布的答案。
我终于能够弄清楚并解决这个问题了:-)
正如我在问题中提到的,无论我使用什么网络架构(本地主机、1Gbps 以太网卡、无线连接等),我实现的带宽都扩展到了 28Gbps 。我尝试将服务器IP地址绑定到几个不同的IP地址,如下:
127.0.0.1
IP address given by my LAN connection
IP address given by my wireless connection
Run Code Online (Sandbox Code Playgroud)
所以我认为这应该给我正确的结果,但事实并非如此。这主要是因为我在同一台计算机上运行客户端和服务器程序(不同的终端窗口,即使客户端和服务器都绑定到不同的IP地址)。我的猜测是这是由内部环回引起的。这就是结果有偏差且不准确的主要原因。
不管怎样,所以我然后尝试在一个工作站上运行客户端,在另一个工作站上运行服务器,我使用不同的网络连接测试它们,它按预期工作:-)
在 1Gbps 连接上,我得到了大约 9800 Mbps (0.96 Gbps),在 10Gbps 连接上,我得到了大约 10100 Mbps(9.86 Gbps)。所以这完全符合我的预期。所以我的做法是正确的。完美的 !!
归档时间: |
|
查看次数: |
7802 次 |
最近记录: |