0%

EMQX 性能测试示例

前言

对 EMQX 5.8.6 (社区版) 做性能测试,包括并发连接数测试和吞吐量测试

测试场景

  • 多对1发布订阅 (大量边端设备上报高频采样数据到云端, 做性能测试)
  • 1对1发布订阅 (云端下发到边端设备的控制指令,低频数据,不做测试)
  • 1对多发布订阅 (云端->边端的通信,低频数据,不做测试)

测试拓扑

测试机器

EMQX Broker 服务端:

  • Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz
  • Debian 12 或 Rocky Linux 9.6 x86_64
  • 32G 内存

压力机:

  • 4核,4G内存
  • Debian 12 或 Rocky Linux 9.6 x86_64
  • 安装 emqtt-bench v0.5.2 测试工具

服务端和压力机执行系统参数调优

配置ulimit等系统参数, 参考文档

安装 emqtt-bench 性能测试工具

每台压力机安装 emqtt-bench 0.5.2

1
2
3
4
5
6
7
8
9
10
11
# 先安装依赖 erl 27.2
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v27.2/erlang-27.2-1.el9.x86_64.rpm
yum install -y erlang-27.2-1.el9.x86_64.rpm
erl -version

# 安装 emqtt-bench
wget https://github.com/emqx/emqtt-bench/releases/download/0.5.2/emqtt-bench-0.5.2-el9-amd64.tar.gz
tar xfz emqtt-bench-0.5.2-el9-amd64.tar.gz
cd bin/
./emqtt_bench
Usage: emqtt_bench pub | sub | conn [--help]

emqtt_bench 基本用法如下:

1
2
3
4
5
# 订阅
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 2 -h emqx -u "test" -P "password@123"

# 发布
./emqtt_bench pub -t "device/%i/telemetry" -c 10000 -h emqx -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

参数说明如下:

参数 描述
-R 新连接创建速率,即每秒新增的客户端数
-c 总客户端连接数
-I 每个客户端发布消息间隔 (默认值: 1000 ms)
-s 指定消息大小 (单位:字节)

Docker compose 部署单节点 EMQX 5.8.6

新增 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
services:
emqx:
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/emqx/emqx:5.8.6
container_name: emqx
hostname: emqx-node1.cluster.local
ports:
- "1883:1883"
- "18083:18083"
volumes:
- emqx_data:/opt/emqx/data
- ./emqx.conf:/opt/emqx/etc/emqx.conf
environment:
- EMQX_HOST=emqx-node1.cluster.local
- EMQX_CLUSTER__DISCOVERY_STRATEGY=static
- EMQX_DASHBOARD__DEFAULT_USERNAME=admin
- EMQX_DASHBOARD__DEFAULT_PASSWORD=password@123
privileged: true
restart: on-failure:3
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 60s
timeout: 15s
retries: 3
start_period: 90s
sysctls:
net.core.somaxconn: 32768
net.ipv4.tcp_syncookies: 1
net.ipv4.tcp_max_syn_backlog: 16384
net.ipv4.tcp_max_tw_buckets: 1048576
net.ipv4.tcp_fin_timeout: 15
net.ipv4.ip_local_port_range: "1024 65535"
ulimits:
nproc: 1048576
nofile:
soft: 1048576
hard: 1048576

networks:
- demo_network

volumes:
emqx_data:

networks:
demo_network:
driver: bridge

创建 emqx.conf (和 docker-compose.yml 同一个目录下)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
node {
name = "emqx@127.0.0.1"
cookie = "emqxsecretcookie"
data_dir = "data"
}

cluster {
name = emqxcl
discovery_strategy = manual
}

dashboard {
listeners {
http.bind = 18083
# https.bind = 18084
https {
ssl_options {
certfile = "${EMQX_ETC_DIR}/certs/cert.pem"
keyfile = "${EMQX_ETC_DIR}/certs/key.pem"
}
}
}
}

mqtt {
mqueue_store_qos0 = false
}

force_shutdown {
enable = false
}

启动 EMQX

1
docker compose up -d

查看 EMQX 空载 CPU和内存使用率:1.8%、290M

并发连接数测试

用例一:测试2000个并发连接 (2000个发布者,每分钟发布1条消息,2个订阅者,消息大小:1024字节,qos 0)

1
2
3
4
5
# 订阅端执行
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 2 -h emqx-node1.cluster.local -u "test" -P "password@123"

# 发布端执行
./emqtt_bench pub -t "device/%i/telemetry" -c 2000 -I 60000 -L 6000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

emqtt-bench 测试工具统计

  • 发布速率:65 msg/s, 订阅速率:65 msg/s
  • 消息发布数:6000,消息订阅数:6000,消息丢失数:0

EMQX 官方看板统计数据

  • 连接数:2002,发布速率:102 msg/s,订阅速率:102 msg/s

CPU、内存使用率统计

EMQX服务端

订阅端

  • EMQ 服务端:312%、2.5G
  • 订阅端:26.7%、610M

用例二:测试5w个并发连接 (5w个发布者,每分钟发布1条消息,2个订阅者,消息大小:1024字节,qos 0)

1
2
3
4
5
# 订阅端执行
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 2 -h emqx-node1.cluster.local -u "test" -P "password@123"

# 发布端执行
./emqtt_bench pub -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -L 300000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

emqtt-bench 测试工具统计

  • 发布速率:966 msg/s, 订阅速率:933 msg/s
  • 消息发布数:30万,消息订阅数:30万,消息丢失数:0

EMQX 官方看板统计数据

  • 连接数:50002,发布速率:965 msg/s,订阅速率:965 msg/s

CPU、内存使用率统计

EMQ负载

订阅端负载

  • EMQ 服务端:220%、1.3G
  • 订阅端:26.7%、610M

用例三:测试10w个并发连接 (10w个发布者,每分钟发布1条消息,2个订阅者,消息大小:1024字节,qos 0)

1
2
3
4
5
# 订阅端执行
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 2 -h emqx-node1.cluster.local -u "test" -P "password@123"

# 发布端执行 (两台压力机同时执行)
./emqtt_bench pub -t "device/%i/telemetry" -c 50000 -R 250 -I 60000 -L 300000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

emqtt-bench 测试工具统计

  • 发布速率:1967 msg/s, 订阅速率:1967 msg/s
  • 消息发布数:60万,消息订阅数:60万,消息丢失数:0

EMQX 官方看板统计数据

  • 连接数:100002,发布速率:1487 msg/s,订阅速率:1487 msg/s

CPU、内存使用率统计

EMQ负载

订阅端负载

  • EMQ 服务端:312%、2.5G
  • 订阅端:26.7%、610M

用例四:测试单节点最大并发连接数 (M个发布者,每分钟发布1条消息,2个订阅者,消息大小:1024字节,qos 0)

给压力机配10个虚拟IP (每个IP测5万个连接,最多可以测50万个并发连接)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 给压力机网卡添加10个虚拟IP, 1个IP测5万个连接
ip addr add 10.17.14.210/24 dev ens192
ip addr add 10.17.14.211/24 dev ens192
ip addr add 10.17.14.212/24 dev ens192
ip addr add 10.17.14.213/24 dev ens192
ip addr add 10.17.14.214/24 dev ens192
ip addr add 10.17.14.215/24 dev ens192
ip addr add 10.17.14.216/24 dev ens192
ip addr add 10.17.14.217/24 dev ens192
ip addr add 10.17.14.218/24 dev ens192
ip addr add 10.17.14.219/24 dev ens192

# 测试完成后,删除IP方法如下:
ip addr del 10.17.14.210/24 dev ens192

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 订阅端执行
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 5 -h emqx-node1.cluster.local -u "test" -P "password@123"

# 10个发布端分别执行
./emqtt_bench pub --ifaddr 10.17.14.210 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.211 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.212 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.213 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.214 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.215 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.216 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.217 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.218 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"
./emqtt_bench pub --ifaddr 10.17.14.219 -t "device/%i/telemetry" -c 50000 -R 500 -I 60000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

实测单节点最大并发连接数达到25万,每分钟1条消息,最大25万连接,吞吐量 4300msg/s

emqtt-bench 测试工具统计

  • 发布速率:4384 msg/s, 订阅速率:4384 msg/s

EMQX 官方看板统计数据

  • 连接数:250002,发布速率:4354 msg/s,订阅速率:4354 msg/s

CPU、内存使用率统计

EMQ负载

订阅端负载

  • EMQ 服务端:948%、6G
  • 订阅端:31.7%、612M

吞吐量测试

用例一:测试2k msg/s 吞吐量 (2000个发布者,每秒发布1条消息,2个订阅者,消息大小:1024字节,qos 0)

1
2
3
4
5
# 订阅端执行
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 2 -h emqx-node1.cluster.local -u "test" -P "password@123"

# 发布端执行
./emqtt_bench pub -t "device/%i/telemetry" -c 2000 -L 300000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

emqtt-bench 测试工具统计

  • 发布速率:1967 msg/s, 订阅速率:1967 msg/s
  • 消息发布数:30万,消息订阅数:30万,消息丢失数:0

EMQX 官方看板统计数据

  • 连接数:2002,发布速率:1989 msg/s,订阅速率:1989 msg/s

CPU、内存使用率统计

EMQ负载

订阅端负载

  • EMQ 服务端:153%、588M
  • 订阅端:26%、610M

用例二:测试1w msg/s 吞吐量 (10000个发布者,每秒发布1条消息,2个订阅者,消息大小:1024字节,qos 0)

1
2
3
4
5
# 订阅端执行
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 2 -h emqx-node1.cluster.local -u "test" -P "password@123"

# 发布端执行
./emqtt_bench pub -t "device/%i/telemetry" -R 300 -c 10000 -L 1500000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

emqtt-bench 测试工具统计

  • 发布速率:9998 msg/s, 订阅速率:9998 msg/s
  • 消息发布数:150万,消息订阅数:150万,消息丢失数:0

EMQX 官方看板统计数据

  • 连接数:10002,发布速率:10010 msg/s,订阅速率:10009 msg/s

CPU、内存使用率统计

EMQ负载

订阅端负载

  • EMQ 服务端:340%、968M
  • 订阅端:53%、610M

用例三:测试5w msg/s 吞吐量 (50000个发布者,每秒发布1条消息,5个订阅者,消息大小:1024字节,qos 0)

1
2
3
4
5
# 订阅端执行
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 2 -h emqx-node1.cluster.local -u "test" -P "password@123"

# 发布端执行
./emqtt_bench pub -t "device/%i/telemetry" -R 500 -c 50000 -L 10000000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

emqtt-bench 测试工具统计

  • 发布速率:50000 msg/s, 订阅速率:50000 msg/s
  • 消息发布数:1000万,消息订阅数:1000万,消息丢失数:0

EMQX 官方看板统计数据

  • 连接数:50005,发布速率:49999 msg/s,订阅速率:49995 msg/s

CPU、内存使用率统计

EMQ负载

订阅端负载

  • EMQ 服务端:1679%、3G
  • 订阅端:164%、610M

用例四: 测试10w msg/s 吞吐量 (5万个发布者,每秒发布2条消息,20个订阅者,消息大小:1024字节,qos 0)

1
2
3
4
5
# 订阅端执行
./emqtt_bench sub -t "\$share/group1/device/+/telemetry" -c 20 -h emqx-node1.cluster.local -u "test" -P "password@123"

# 发布端执行
./emqtt_bench pub -t "device/%i/telemetry" -R 500 -I 500 -c 50000 -L 15000000 -h emqx-node1.cluster.local -s 1024 -m "$(base64 /dev/urandom | head -c 1024)" -u "test" -P "password@123"

emqtt-bench 测试工具统计

  • 发布速率:100010 msg/s, 订阅速率:100010 msg/s
  • 消息发布数:1500万,消息订阅数:1500万,消息丢失数:0

EMQX 官方看板统计数据

  • 连接数:50020,发布速率:100000 msg/s,订阅速率:100006 msg/s

CPU、内存使用率统计

EMQ负载

订阅端负载

  • EMQ 服务端:1650%、4.3G
  • 订阅端:537%、635M

测试结果

多对一发布订阅场景,EMQX 5.8.6 单节点可支持25w以上并发连接,测试吞吐量达 10w msg/s 以上

并发连接数测试结果

并发连接数 发布者数 订阅者数 发布速率 订阅速率 消息发布数 消息订阅数 消息丢失数 EMQ服务端 CPU EMQ服务端内存
2000 2000 2 65 msg/s 65 msg/s 6000 6000 0 10% 343 M
5万 5万 2 966 msg/s 933 msg/s 30万 30万 0 220% 1.3 G
10万 10万 2 1487 msg/s 1487 msg/s 60万 60万 0 312% 2.5 G
25万 25万 2 4354 msg/s 4354 msg/s 150万 150万 0 948% 6G

吞吐量测试结果

测试吞吐量 发布者数 订阅者数 发布速率 订阅速率 消息发布数 消息订阅数 消息丢失数 EMQ服务端 CPU EMQ服务端内存
2000 msg/s 2000 2 1967 msg/s 1967 msg/s 30万 30万 0 153% 588 M
1万 msg/s 1万 2 9998 msg/s 9998 msg/s 150万 150万 0 340% 968 M
5万 msg/s 5万 5 50000 msg/s 50000 msg/s 1000万 1000万 0 1679% 3 G
10万 msg/s 10万 20 100010 msg/s 100010 msg/s 1500万 1500万 0 1650% 4.3 G

参考文档