iperf - 吞吐量测试
作者:拓毅恒
一、概述
iperf 是一个网络性能测试工具,用于测量网络带宽和吞吐量,可在客户端与服务器之间进行数据传输测试。在如下场景中,iperf 可以帮助开发者进行网络性能评估:
1、测试设备与服务器之间的最大带宽; 2、评估网络连接质量和稳定性; 3、排查网络传输中的性能瓶颈; 4、验证网络配置的合理性。
LuatOS 提供的 iperf 库支持 server 模式和 client 模式,但需要注意的是,当前版本支持的是 iperf2 协议,不支持 iperf3 协议。
二、核心示例
1、核心示例是指:使用本库文件提供的核心API,开发的基础业务逻辑的演示代码; 2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单; 3、更加完整和详细的demo,请参考 LuatOS仓库 中各个产品目录下的demo/iperf
-- iperf 吞吐量测试功能演示
-- 支持server模式和client模式
-- 注意:支持的是iperf2,不支持iperf3
-- 启动server模式, 监听5001端口
-- 注意, 该网卡必须已经联网成功, 并且有ip地址
if iperf then
log.info("启动iperf服务器端")
iperf.server(socket.LWIP_ETH)
end
-- 测试结果回调
sys.subscribe("IPERF_REPORT", function(bytes, ms_duration, bandwidth)
log.info("iperf", bytes, ms_duration, bandwidth)
end)
三、常量详解
核心库常量,顾名思义是由合宙LuatOS内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
iperf 核心库没有专用常量。
四、函数详解
iperf.server(id, port)
功能
启动 iperf 服务器模式,用于接收来自 iperf 客户端的连接和数据传输测试请求。
参数
id
参数含义:网络适配器的ID;
数据类型:number;
取值范围:参考socket api中的常量详解,例如socket.LWIP_ETH表示以太网;
是否必选:必须传入此参数;
注意事项:该网卡必须已经联网成功,并且有IP地址;
参数示例:socket.LWIP_ETH
port
参数含义:服务器监听的端口号;
数据类型:number;
取值范围:有效的端口号范围;
是否必选:可选传入此参数;
默认值:5001;
注意事项:暂无;
参数示例:5001
返回值
含义说明:服务器启动结果;
数据类型:boolean;
取值范围:true或false;
true表示服务器启动成功;
false表示服务器启动失败;
注意事项:暂无;
返回示例:true
示例
-- 启动server模式,监听5001端口
-- 注意,该网卡必须已经联网成功,并且有ip地址
if iperf then
log.info("启动iperf服务器端")
iperf.server(socket.LWIP_ETH)
end
-- 测试结果回调
sys.subscribe("IPERF_REPORT", function(bytes, ms_duration, bandwidth)
log.info("iperf", bytes, ms_duration, bandwidth)
end)
iperf.client(id, ip, port)
功能
启动 iperf 客户端模式,用于连接到 iperf 服务器并进行数据传输测试。
参数
id
参数含义:网络适配器的ID;
数据类型:number;
取值范围:参考socket api中的常量详解,例如socket.LWIP_ETH表示以太网;
是否必选:必须传入此参数;
注意事项:该网卡必须已经联网成功,并且有IP地址;
参数示例:socket.LWIP_ETH
ip
参数含义:远程服务器的IP地址;
数据类型:string;
取值范围:只能是IPv4地址,不支持域名;
是否必选:必须传入此参数;
注意事项:确保该服务器正在运行iperf服务;
参数示例:"47.94.236.172"
port
参数含义:远程服务器的端口号;
数据类型:number;
取值范围:有效的端口号范围;
是否必选:可选传入此参数;
默认值:5001;
注意事项:确保与服务器监听的端口一致;
参数示例:5001
返回值
含义说明:客户端启动结果;
数据类型:boolean;
取值范围:true或false;
true表示客户端启动成功;
false表示客户端启动失败;
注意事项:暂无;
返回示例:true
示例
-- 启动client模式,连接服务器的5001端口
-- 注意,该网卡必须已经联网成功,并且有ip地址
if iperf then
log.info("启动iperf客户端端")
-- 47.94.236.172 是演示服务器,不一定有开启
iperf.client(socket.LWIP_ETH, "47.94.236.172")
sys.wait(60*1000)
-- 测试完成停掉
iperf.abort()
end
-- 测试结果回调
sys.subscribe("IPERF_REPORT", function(bytes, ms_duration, bandwidth)
log.info("iperf", bytes, ms_duration, bandwidth)
end)
iperf.abort()
功能
关闭当前正在运行的 iperf 测试,无论是 server 模式还是 client 模式。
参数
无
返回值
含义说明:关闭操作的结果;
数据类型:boolean;
取值范围:true或false;
true表示关闭成功;
false表示关闭失败;
注意事项:暂无;
返回示例:true
示例
-- 关闭已经启动的server或者client
if iperf then
iperf.abort()
end
五、产品支持说明
支持LuatOS开发的所有产品都支持iperf核心库。