跳转至

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