跳转至

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 核心库。