1、iperf源码下载
(1)源码下载地址:https://iperf.fr/iperf-download.php;
(2)有的版本源码下载下来并不能直接编译成功,可能会报缺少头文件或者编译选项的错误,要么去解决这些错误,要么换个版本再试一下;
(3)在我的环境中,2.0.9版本的iperf是可以直接编译成功的,下面的讲解都是基于2.0.9版本;
(4)如果只是用iperf的基本功能,比如测网络带宽,没必要下载最新版本的iperf,最好是和你的交叉编译工具链时间上相近的;
2、iperf编译
//配置iperf源码,指定交叉编译工具链,静态链接成可执行程序
./configure --host=arm-himix200v002-linux CXXFLAGS=-static
make
(1)iperf源码中,刚解压开时是没有Makefile的,需要先运行顶层目录的configure配置文件,根据配置生成Makefile;
(2)在运行configure文件时,通过–host指定交叉编译工具链,CXXFLAGS指定是静态链接还是动态链接,如果还需要配置其他的去查看configure源码;
(3)在顶层生成Makefile文件后,使用make命令编译,在./src目录下会生成iperf可执行程序;
3、iperf工具测试网络带宽
3.1、测试网络带宽的基本原理
(1)iperf工具采用的客户端/服务器模式,统计客户端和服务器之间传递数据的多少和耗时,计算出网络带宽;
(2)在A设备上运行iperf指定为服务器模式;在B设备上运行iperf工具指定为客户端模式,然后客户端去连接服务器端,iperf就可统计出网络代码;
3.2、测试网络带宽的命令
//A设备:-s表示服务器端;
iperf -s
//B设备:
//-c --表示客户端,
//192.168.0.11 --是服务器端的ip
//-t 100 --测试100秒
//-i 5 --每5秒打印一下测试结果
//-P 20 创建20个线程去测试网络带宽
iperf -c 192.168.0.11 -t 100 -i 5
(1)首先确认A和B设备之间网络能ping通;
(2)A设备:运行服务器端;
(3)B设备:运行客户端;
3.3、实测效果
~ # iperf -c 192.168.0.11 -t 100 -i 5
------------------------------------------------------------
Client connecting to 192.168.0.11, TCP port 5001
TCP window size: 43.8 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.0.22 port 40052 connected with 192.168.0.11 port 5001
[ 3] 35.0-40.0 sec 56.0 MBytes 94.0 Mbits/sec
[ 3] 40.0-45.0 sec 56.2 MBytes 94.4 Mbits/sec
[ 3] 45.0-50.0 sec 55.9 MBytes 93.7 Mbits/sec
[ 3] 50.0-55.0 sec 56.2 MBytes 94.4 Mbits/sec
[ 3] 55.0-60.0 sec 55.9 MBytes 93.7 Mbits/sec
[ 3] 60.0-65.0 sec 56.2 MBytes 94.4 Mbits/sec
[ 3] 65.0-70.0 sec 56.2 MBytes 94.4 Mbits/sec
[ 3] 70.0-75.0 sec 56.0 MBytes 94.0 Mbits/sec
[ 3] 75.0-80.0 sec 56.1 MBytes 94.2 Mbits/sec
[ 3] 80.0-85.0 sec 56.0 MBytes 94.0 Mbits/sec
[ 3] 85.0-90.0 sec 56.2 MBytes 94.4 Mbits/sec
[ 3] 90.0-95.0 sec 55.9 MBytes 93.7 Mbits/sec
[ 3] 95.0-100.0 sec 56.2 MBytes 94.4 Mbits/sec
[ 3] 0.0-100.0 sec 1.10 GBytes 94.1 Mbits/sec
上面是100M网口的测试结果,平均94Mb/s左右,也就是11.75MB/s,比100M网口的理论值12.5MB/s稍低一点,但也在正常范围内。
3.4、测试需要注意的点
3.4.1、网络自协商
(1)在测试带宽时,需要注意内核识别到当前网口时千兆还是百兆;比如当前你要测试的网口本身物理硬件上是千兆的,当你插上网线后,内核会有网口上线的打印,100Mbit/s表示是百兆网口,1Gbit/s表示是千兆网口;
(2)千兆网口插上网线后不一定就是千兆。网卡有自协商机制,如果你使用的网线是百兆网线,或者对端是百兆的交换机、百兆的网口,经过自协商机制,千兆的网口会想百兆网口对齐,导致千兆网口只有百兆的网速;
总结:确保千兆网口的配套环境支持千兆的网速;
3.4.2、线程数限制了打流的上限
(1)iperf软件测试网络带宽的基本原理是在两个网口间收发数据,以及来统计网络带宽,收发的过程是线程来控制的;
(2)比如测试千兆网口,当不指定测试线程数时默认是使用单个线程来测试带宽,可能测试到只有400Mbit/s,远小于正常的千兆网口的网速;但实际网速可能是千兆,iperf软件测出来只有400Mbit/s只是因为单个线程的收发能力只能到400Mbit/s,而不是带宽只有400Mbit/s;
总结:当测试出来的带宽小于正常带宽时,尝试通过"-P"选项增加测试的线程数,如果增加测试线程得到的带宽在增加,说明是测试线程数限制了测试带宽,继续尝试增加测试线程数,知道测试出来的带宽不再随着测试线程的增加而增加;
4、编译报错:checking host system type… Invalid configuration `arm-none-linux-guneabi
4.1、配置文件出错
wget -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD'
wget -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD'
(1)首先考虑拷贝当前编译服务器的配置文件去替换源码中的配置文件:
cp /usr/share/libtool/config/config.sub ./config.sub
cp /usr/share/libtool/config/config.guess ./config.guess
(2)第一步不能解决,则更新libtool工具,再拷贝配置文件;
(3)第二步也不能解决,则执行上面的命令去下载配置文件,再拷贝配置文件;
4.2、编译链名字
4.2.1、出错的原因
(1)替换配置文件都不能解决问题后,可能是编译链的名字导致;
(2)导致出错有两种可能,一是编译链的名字过长,而是编译链的开头需要是芯片的架构;
4.2.2、解决办法:
(1)重新建立链接去指向真正的编译链,比如arm64位的芯片,链接名字取名为:aarch64-linux-xx;不用为每个编译链都重命令,只需要gcc、g++、ar、ld这些基础的编译工具;
(2)将编译链的目录导出到环境变量,在配置configure时,只需要指定–host=aarch64-linux;
推荐
给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转