• 已删除用户
Administrator
发布于 2022-06-20 / 4 阅读
0

MQTT 性能测试之 emqtt-bench

emqtt_bench 是基于 Erlang 编写的,一个简洁强大的 MQTT 协议性能测试工具。

编译安装

官方文档采用的源码编译方式,我参照文档进行编译时一步一坑不停的踩坑,也没能编译成功。最终还是下载预编译的二进制文件包,解压直接运行,省时省力。

# 解压
tar -zxvf xxx.tar.gz

# 进入到bin目录
cd xxx/bin

# 执行命令查看帮助
./emqtt_bench --help

命令使用

emqtt_bench 共三个子命令:

  1. conn:用于创建大量的连接。

  2. pub:用于创建大量客户端执行发布消息的操作。

  3. sub:用于创建大量客户端执行订阅主题,并接受消息的操作。

常用参数如下:

参数

简写

可选值

默认值

说明

–host

-h

-

localhost

要连接的 MQTT 服务器地址

–port

-p

-

1883

要连接的 MQTT 服务器端口

–version

-V

3、4、5

5

MQTT 协议版本

–count

-c

-

200

客户端数量

–startnumber

-n

-

0

客户端编号起始值

–interval

-i

-

10

每间隔多少时间创建一个客户端;单位:毫秒

–interval_of_msg

-I

-

1000

每间隔多少时间发送一条消息;单位:毫秒

–username

-u

-

‘’

客户端用户名

–password

-P

-

‘’

客户端密码,注意 “-P” 为大写,我在这里踩了坑

–topic

-t

-

‘’

发布消息的主题,支持站位符。%c 表示 ClientId,%u 表示 Username,%i 表示客户端的序列数。

–size

-s

-

256

消息 Payload 的大小;单位:字节

–qos

-q

-

0

消息的 QoS 等级

–retain

-r

true、false

false

是否保留消息

–keepalive

-k

-

300

客户端心跳时间;单位:秒

–clean

-C

true、false

true

是否以清除会话的方式建立连接

–ssl

-S

true、false

false

是否使用 SSL 连接

–certfile

-

-

-

客户端证书文件

–keyfile

-

-

-

客户端私钥文件

–ws

-

true、false

false

是否以 Websocket 的方式建立连接

–ifaddr

-

-

-

指定客户端连接使用的本地网卡

–prefix

-

-

-

客户端 ID 的前缀

–shortids

-

-

-

客户端 ID 是否使用短 ID

连接

执行 ./emqtt_bench conn --help 可得到该子命令所有可用的参数。它们的解释已包含在上表中,此处略过。
例如,我们启动 500 个连接,每 1 毫秒创建一个连接,连接时使用用户名密码认证,用户名为 username,密码为 password,客户端 ID 以 FG19CC1 为前缀,客户端 ID 使用短 ID,客户端编号起始值为10000,连接的服务器地址为 host

./emqtt_bench conn -h ${host} -u ${username} -P ${password} -c 500 -i 1 -k 60 --prefix FG19CC1 -s -n 10000

此时,我们模拟出了一批有规则的客户端连接。

FG19CC110000
FG19CC110001
...
FG19CC110499

发布

执行 ./emqtt_bench pub --help 会得到可用的参数输出。它们的解释已包含在上表中,此处略过。
例如,我们启动 10 个连接,分别每秒向主题 t 发送 100 条 Qos0 消息,其中每个消息体的大小为 16 字节大小:

./emqtt_bench pub -t t -h emqx-server -s 16 -q 0 -c 10 -I 10

订阅

执行 ./emqtt_bench sub --help 可得到该子命令的所有的可用参数。它们的解释已包含在上表中,此处略过。
例如,我们启动 500 个连接,每个都以 Qos0 订阅 t 主题:

./emqtt_bench sub -t t -h emqx-server -c 500

系统调优

客户端的压力机和服务端的机器都需要执行系统参数的调优,否则会影响测试结果。这里仅介绍压力机的调优。

  1. 系统全局允许分配的最大文件句柄数:

# 2 millions system-wide
sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152
echo 2097152 > /proc/sys/fs/nr_open
  1. 允许当前会话 / 进程打开文件句柄数:

ulimit -n 1048576
  1. /etc/sysctl.conf

持久化 ‘fs.file-max’ 设置到 /etc/sysctl.conf 文件:

fs.file-max = 1048576

/etc/systemd/system.conf 设置服务最大文件句柄数:

DefaultLimitNOFILE=1048576
  1. /etc/security/limits.conf

/etc/security/limits.conf 持久化设置允许用户 / 进程打开文件句柄数:

* soft nofile 1048576 
* hard nofile 1048576

参考资料

  1. 性能测试 | EMQX4.4 文档 emqtt-bench

  2. 系统调优 | EMQX4.4 文档 emqtt-bench

  3. github | emqtt-bench