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 netdrv.ready(socket.LWIP_STA) then
-- local ipv4 = netdrv.ipv4(socket.LWIP_STA)
-- if ipv4 and ipv4.addr ~= "0.0.0.0" then
-- -- 网卡已联网且有IP地址
-- log.info("网络已连接")
-- end
-- end
if iperf then
log.info("启动iperf服务器端")
iperf.server(socket.LWIP_ETH)
end
-- 服务器启动后,客户端可以通过以下方式访问:
-- 1. 使用外部iperf客户端工具连接到服务器IP的5001端口
-- 2. 在其他支持iperf的设备上使用iperf.client()函数连接
-- 3. 客户端命令示例:iperf -c 服务器IP地址 -i 1 -t 10 -p 5001
-- 回调函数参数说明:
_-- bytes:_测试传输的总字节数;
_-- ms_duration_:测试持续的时间(毫秒);
_-- bandwidth:_测试的带宽值(单位:bps);
function iperf_func(bytes, ms_duration, bandwidth)
log.info("iperf", bytes, ms_duration, bandwidth)
end
-- 测试结果回调
-- 通常在测试开始后1-2秒内会收到第一条结果,之后根据测试配置定期收到结果
-- 对于客户端模式,测试结果会在测试完成时一次性返回
-- 对于服务器模式,每次接收到客户端连接并完成测试后都会触发此回调
sys.subscribe("IPERF_REPORT", iperf_func)
三、常量详解
核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为LuatOS内核固件可能会变更每个常量对应的常量取值;
如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;
| 常量 | 类型 | 解释 |
| IPERF_REPORT | string | iperf测试结果报告事件名称,用于订阅测试结果回调 当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
-- 回调函数参数说明:
_-- bytes:_测试传输的总字节数;
_-- ms_duration_:测试持续的时间(毫秒);
_-- bandwidth:_测试的带宽值(单位:bps);
function iperf_func(bytes, ms_duration, bandwidth)
log.info("iperf", bytes, ms_duration, bandwidth)
end
-- 测试结果回调
-- 对于服务器模式,每次接收到客户端连接并完成测试后都会触发此回调
sys.subscribe("IPERF_REPORT", iperf_func)
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
-- 回调函数参数说明:
_-- bytes:_测试传输的总字节数;
_-- ms_duration_:测试持续的时间(毫秒);
_-- bandwidth:_测试的带宽值(单位:bps);
function iperf_func(bytes, ms_duration, bandwidth)
log.info("iperf", bytes, ms_duration, bandwidth)
end
-- 测试结果回调
-- 对于客户端模式,测试结果会在测试完成时一次性返回
sys.subscribe("IPERF_REPORT", iperf_func)
iperf.abort()
功能
关闭当前正在运行的 iperf 测试,无论是 server 模式还是 client 模式。
参数
无
返回值
含义说明:关闭操作的结果;
数据类型:boolean;
取值范围:true或false;
true表示关闭成功;
false表示关闭失败;
注意事项:暂无;
返回示例:true
示例
-- 关闭已经启动的server或者client
if iperf then
iperf.abort()
end
五、产品支持说明
支持 LuatOS 开发的所有产品都支持 iperf 核心库。