性能工具之emqtt-bench BenchMark 测试示例

2024-04-17 20:20

本文主要是介绍性能工具之emqtt-bench BenchMark 测试示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、前言
  • 二、典型压测场景
  • 三、机器准备
  • 四、典型压测场景
    • 1、并发连接
    • 2、消息吞吐量测试
      • 2.1 1 对 1(示例)
      • 2.2 多对1(示例)
      • 2.3 1对多(示例)
  • 五、遇到的问题
    • client(): EXIT for {shutdown,eaddrnotavail}
  • 六、附录:调优建议
    • 1、关闭交换分区
    • 2、Linux 操作系统参数
    • 3、TCP 协议栈网络参数
    • 3、测试客户端设置

一、前言

在前面两篇文章中介绍了emqtt-bench工具和MQTT的入门压测,本文示例 emqtt_bench 对 MQTT Broker 做 Beachmark 测试,让大家对 MQTT消息中间 BenchMark 测试有个整体了解,方便平常在压测工作查阅。

  • 如何入门做物联网系统压测?
  • 性能工具之emqtt_bench快速上手

二、典型压测场景

BenchMark 测试以 MQTT 最典型的场景来验证其性能:

  • 并发连接:使用 emqtt-bench 创建海量连接到 MQTT Broker。
  • 消息吞吐量测试:使用 emqtt-bench 在 EMQX 中创建出海量的 Qos0 消息吞吐量,分别模拟发布-订阅 1对1,1对多,多对1这 3 种类型场景。

三、机器准备

共需准备六台服务器,一台为 EMQX Broker,七台为客户端压力机。其中:

EMQX Broker(1台):

  • 系统:CentOS Linux release 7.6.1810 (Core)
  • CPU:8C
  • 内存:8GB
  • 服务端:EMQX 5.1.6
  • 压力机:emqtt-bench-0.4.18-el7-amd64.tar.gz

压力机(6台):

  • 系统:CentOS Linux release 7.6.1810 (Core)
  • CPU:8C
  • 内存:16GB
  • 压力机:emqtt-bench-0.4.18-el7-amd64.tar.gz

四、典型压测场景

1、并发连接

  • 场景名称:MQTT Broker 单节点支持 30 万级设备在线,背景连接 (只连接不发送消息)
  • 描述:模拟 30 万 MQTT TCP 并发连接,并保持在线,测试执行 1 个小时。
  • 期望结果:内网测试成功率为 100%,无连接掉线,CPU 和内存在测试期间表现平稳,没有大幅度的抖动。

拓扑结构如下:
在这里插入图片描述

在6台客户端压力机上同时执行该命令,在每台压力机上启动 5w 的连接数,共计 30w 的连接:

./emqtt_bench conn -h emqx-server -c 50000

客户端压力机执行截图:
在这里插入图片描述

EMQX Broker运行情况:
在这里插入图片描述
在 MQTT Broker 单节点 8C8G的情况,我压到的峰值是30W连接,超过会导致服务崩溃。

2、消息吞吐量测试

注意这里我只具体说明如何设置,并不是实际压测场景数据。

2.1 1 对 1(示例)

  • 场景名称:MQTT Broker 单节点 500 并发连接下支持1000 QoS0 消息吞吐
  • 描述:1000 MQTT TCP 连接, pub 客户端和 sub 客户端数量相同都是 500,每个接收端均订阅一个对应的发送端 pub 主题,每个 pub 客户端每秒发送 2 条 QoS 0、payload 为 256 字节(默认值)的消息。因此消息发送和接收均为每秒 1000,总的消息吞吐达到每秒 2000。测试执行 1 个小时。
  • 期望结果:内网测试成功率为 100%,无消息积压,CPU 和内存在测试期间表现平稳,没有大幅度的抖动。

拓扑结构如下:
在这里插入图片描述

单台sub 客户端压力机:

./emqtt_bench sub -t test_topic_%i -h emqx-server -c 500

参数说明:

  • -s:消息 Payload 的大小;单位:字节。不加默认256字节。
  • -t:topic,%i:表示客户端的序列数
  • -h:要连接的 MQTT 服务器地址
  • -c:客户端总数
[root@ bin]# ./emqtt_bench sub -t test_topic_%i -h emqx-server -c 500
Start with 8 workers, addrs pool size: 1 and req interval: 80 ms 1s sub total=104 rate=103.28/sec
1s connect_succ total=104 rate=103.28/sec
2s sub total=200 rate=96.00/sec
2s connect_succ total=200 rate=96.00/sec
3s sub total=296 rate=96.00/sec
3s connect_succ total=296 rate=96.00/sec
4s sub total=400 rate=104.00/sec
4s connect_succ total=400 rate=104.00/sec
5s sub total=496 rate=96.00/sec
5s connect_succ total=496 rate=96.00/sec
6s sub total=500 rate=4.00/sec
6s connect_succ total=500 rate=4.00/sec

单台 pub 客户端压力机:

./emqtt_bench pub -t test_topic/%i -h  emqx-server -c 500 -I 500

参数说明:

  • -s:消息 Payload 的大小;单位:字节。不加默认256字节。
  • -t:topic,%i:表示客户端的序列数
  • -h:要连接的 MQTT 服务器地址
  • -c:客户端总数
  • -I:每间隔多少时间创建一个客户端;单位:毫秒
[root@ bin]# ./emqtt_bench pub -t test_topic/%i -h  emqx-server -c 500 -I 500
Start with 8 workers, addrs pool size: 1 and req interval: 80 ms 1s pub total=160 rate=159.05/sec
1s connect_succ total=104 rate=103.38/sec
2s pub total=512 rate=352.00/sec
2s connect_succ total=200 rate=96.00/sec
3s pub total=1056 rate=544.00/sec
3s connect_succ total=296 rate=96.00/sec
4s pub total=1808 rate=752.00/sec
4s connect_succ total=400 rate=104.00/sec
5s pub total=2752 rate=944.00/sec
5s connect_succ total=496 rate=96.00/sec
6s pub total=3752 rate=1000.00/sec
6s connect_succ total=500 rate=4.00/sec
7s pub total=4752 rate=1000.00/sec
8s pub total=5752 rate=1000.00/sec
9s pub total=6752 rate=1000.00/sec
10s pub total=7752 rate=1000.00/sec
11s pub total=8752 rate=1000.00/sec
12s pub total=9752 rate=1000.00/sec
13s pub total=10752 rate=1000.00/sec
14s pub total=11752 rate=1000.00/sec

在订阅客户端压力机,可看到当前接收消息的速率,类似于:

12s pub total=9752 rate=1000.00/sec

MQTT Broker 运行情况:
在这里插入图片描述

2.2 多对1(示例)

  • 场景名称:并发连接+消息吞吐(上报)
  • 描述:501 MQTT TCP 连接, pub 客户端 500 和 sub 客户端1,接收端均订阅同一个主题,每个 pub 客户端每秒发送 2 条 QoS 0、payload 为 256 字节的消息。因此消息发送和接受均为每秒 1000,总的消息吞吐达到每秒 2000。测试执行 1 个小时。
  • 期望结果:内网测试成功率为 100%,无消息积压,CPU 和内存在测试期间表现平稳,没有大幅度的抖动。

拓扑结构如下:
在这里插入图片描述

单台 sub 客户端压力机:

./emqtt_bench sub -t test_topic -h emqx-server -c 1

参数说明:

  • -s:消息 Payload 的大小;单位:字节。不加默认256字节。
  • -t:topic,%i:表示客户端的序列数
  • -h:要连接的 MQTT 服务器地址
  • -c:客户端总数
[root@ bin]# ./emqtt_bench sub -t test_topic -h emqx-server -c 1
Start with 8 workers, addrs pool size: 1 and req interval: 80 ms 1s sub total=1 rate=0.99/sec
1s connect_succ total=1 rate=0.99/sec

单台 pub 客户端压力机:

./emqtt_bench pub -t test_topic -h  emqx-server -c 500 -I 500

参数说明:

  • -s:消息 Payload 的大小;单位:字节。不加默认256字节。
  • -t:topic,%i:表示客户端的序列数
  • -h:要连接的 MQTT 服务器地址
  • -c:客户端总数
  • -I:每间隔多少时间创建一个客户端;单位:毫秒
root@bin]# ./emqtt_bench pub -t test_topic -h  emqx-server -c 500 -I 500
Start with 8 workers, addrs pool size: 1 and req interval: 80 ms 1s pub total=160 rate=158.89/sec
1s connect_succ total=104 rate=103.28/sec
2s pub total=496 rate=336.00/sec
2s connect_succ total=184 rate=80.00/sec
3s pub total=1040 rate=544.00/sec
3s connect_succ total=296 rate=112.00/sec
4s pub total=1792 rate=752.00/sec
4s connect_succ total=400 rate=104.00/sec
5s pub total=2736 rate=944.00/sec
5s connect_succ total=496 rate=96.00/sec
6s pub total=3736 rate=1000.00/sec
6s connect_succ total=500 rate=4.00/sec
7s pub total=4736 rate=1000.00/sec
8s pub total=5736 rate=1000.00/sec
9s pub total=6736 rate=1000.00/sec
10s pub total=7736 rate=1000.00/sec
11s pub total=8736 rate=1000.00/sec
12s pub total=9736 rate=1000.00/sec
13s pub total=10736 rate=1000.00/sec
14s pub total=11736 rate=1000.00/sec
15s pub total=12736 rate=1000.00/sec
16s pub total=13736 rate=1000.00/sec
17s pub total=14736 rate=1000.00/sec

MQTT Broker 运行情况(举例):
在这里插入图片描述

2.3 1对多(示例)

  • 场景名称:消息广播
  • 描述:501 MQTT TCP 连接, pub 客户端 1 和 sub 客户端 500,接收端均订阅同一个主题,pub 客户端每秒发送 2 条 QoS 0、payload 为 256 字节的消息。因此消息发送为每秒 2,消息接收为每秒 1000,总的消息吞吐达到每秒 1002。测试执行 1 个小时。
  • 期望结果:内网测试成功率为 100%,无消息积压,CPU 和内存在测试期间表现平稳,没有大幅度的抖动。

拓扑结构如下:
在这里插入图片描述

单台 sub 客户端压力机:

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

参数说明:

  • -s:消息 Payload 的大小;单位:字节。不加默认256字节。
  • -t:topic,%i:表示客户端的序列数
  • -h:要连接的 MQTT 服务器地址
  • -c:客户端总数
[root@d bin]# ./emqtt_bench sub -t test_topic -h emqx-server -c 500
Start with 8 workers, addrs pool size: 1 and req interval: 80 ms 1s sub total=104 rate=103.38/sec
1s connect_succ total=104 rate=103.38/sec
2s sub total=200 rate=96.00/sec
2s connect_succ total=200 rate=96.00/sec
3s sub total=296 rate=96.00/sec
3s connect_succ total=296 rate=96.00/sec
4s sub total=400 rate=104.00/sec
4s connect_succ total=400 rate=104.00/sec
5s sub total=496 rate=96.00/sec
5s connect_succ total=496 rate=96.00/sec
6s sub total=500 rate=4.00/sec
6s connect_succ total=500 rate=4.00/sec

单台 pub 客户端压力机:

./emqtt_bench pub -t test_topic -h  emqx-server -c 1 -I 500

参数说明:

  • -s:消息 Payload 的大小;单位:字节。不加默认256字节。
  • -t:topic,%i:表示客户端的序列数
  • -h:要连接的 MQTT 服务器地址
  • -c:客户端总数
  • -I:每间隔多少时间创建一个客户端;单位:毫秒
[root@ bin]# ./emqtt_bench pub -t test_topic -h  emqx-server -c 1 -I 500
Start with 8 workers, addrs pool size: 1 and req interval: 80 ms 1s pub total=2 rate=1.99/sec
1s connect_succ total=1 rate=0.99/sec
2s pub total=4 rate=2.00/sec
3s pub total=6 rate=2.00/sec
4s pub total=8 rate=2.00/sec
5s pub total=10 rate=2.00/sec
6s pub total=12 rate=2.00/sec
7s pub total=14 rate=2.00/sec
8s pub total=16 rate=2.00/sec
9s pub total=18 rate=2.00/sec
10s pub total=20 rate=2.00/sec
11s pub total=22 rate=2.00/sec
12s pub total=24 rate=2.00/sec
13s pub total=26 rate=2.00/sec
14s pub total=28 rate=2.00/sec
15s pub total=30 rate=2.00/sec
16s pub total=32 rate=2.00/sec
17s pub total=34 rate=2.00/sec

EMQX Broker 运行情况(举例):

在这里插入图片描述

五、遇到的问题

client(): EXIT for {shutdown,eaddrnotavail}

在压力机连接超过5万的时候,出现了emqtt_bench客户端报错的情况。

EMQX Broker 运行情况:
在这里插入图片描述
单台客户端压力机报错截图:
在这里插入图片描述

通过设置以下内核参数解决:

#允许当前会话 / 进程打开文件句柄数:
ulimit -n 1048576# 可用端口范围:
sudo sysctl -w net.ipv4.ip_local_port_range="1025 65534"

原因分析:
Linux 内核在这个范围内选择一个可用的端口作为本地端口去connect服务器,如果没有可用的端口可用,比如这个范围内的端口都处于如下状态中的一种:

  1. bind使用的端口
  2. 端口处于非TIME_WAIT状态
  3. 端口处于TIME_WAIT状态,但是没有启用tcp_tw_reuse,那么就会返回EADDRNOTAVAIL错误。

一般情况下,出现这个错误可用使用如下方法解决问题:

  1. 增大可选端口的范围,修改/proc/sys/net/ipv4/ip_local_port_range的值。
  2. 开启tcp_tw_reuse,允许使用TIME_WAIT状态的端口。

六、附录:调优建议

当然,我们也可以在 Beachmark 测试前就做好服务器参数调优,可以参考以下的内容。

1、关闭交换分区

Linux 交换分区可能会导致 EMQX Broker 出现不确定的内存延迟,影响系统的稳定性。 建议永久关闭交换分区。

  • 要立即关闭交换分区,执行命令 sudo swapoff -a。
  • 要永久关闭交换分区,在 /etc/fstab 文件中注释掉 swap 行,然后重新启动主机。

2、Linux 操作系统参数

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

sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152
echo 2097152 > /proc/sys/fs/nr_open

允许当前会话 / 进程打开文件句柄数:

ulimit -n 1048576

/etc/sysctl.conf

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

fs.file-max = 1048576

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

DefaultLimitNOFILE=1048576

/etc/security/limits.conf

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

*      soft   nofile      1048576
*      hard   nofile      1048576

3、TCP 协议栈网络参数

并发连接 backlog 设置:

sysctl -w net.core.somaxconn=32768
sysctl -w net.ipv4.tcp_max_syn_backlog=16384
sysctl -w net.core.netdev_max_backlog=16384

可用端口范围:

sysctl -w net.ipv4.ip_local_port_range='1024 65535'

TCP Socket 读写 Buffer 设置:

sysctl -w net.core.rmem_default=262144
sysctl -w net.core.wmem_default=262144
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.core.optmem_max=16777216sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216'
sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'

TCP 连接追踪设置:

sysctl -w net.nf_conntrack_max=1000000
sysctl -w net.netfilter.nf_conntrack_max=1000000
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

TIME-WAIT Socket 最大数量、回收与重用设置:

sysctl -w net.ipv4.tcp_max_tw_buckets=1048576# 注意:不建议开启該设置,NAT 模式下可能引起连接 RST
# sysctl -w net.ipv4.tcp_tw_recycle=1
# sysctl -w net.ipv4.tcp_tw_reuse=1

FIN-WAIT-2 Socket 超时设置:

sysctl -w net.ipv4.tcp_fin_timeout=15

3、测试客户端设置

测试客户端服务器在一个接口上,最多只能创建 65000 连接:

# 可用端口范围:
sysctl -w net.ipv4.ip_local_port_range="500 65535"#允许当前会话 / 进程打开文件句柄数:
echo 1048576 > /proc/sys/fs/nr_open
ulimit -n 1048576

参考资料:

  • 系统调优
  • 使用 eMQTT-Bench 进行性能测试

这篇关于性能工具之emqtt-bench BenchMark 测试示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912752

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

OpenCompass:大模型测评工具

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型数据侧总结大模型token等基本概念及参数和内存的关系大模型应用开发-华为大模型生态规划从零开始的LLaMA-Factor

简鹿文件批量重命名:一款文件批量改名高手都在用的工具

作为 IT 行业的搬砖民工,互联网的数据量爆炸性增长,文件管理成为了一项日益重要的任务。"简鹿文件批量重命名"应运而生,旨在为用户提供一个高效、灵活的解决方案,以应对繁琐的文件命名、排序、创建及属性修改等挑战。 这款软件凭借其一键式操作、强大的自定义规则导入、以及全面的批量处理能力,极大地简化了文件管理流程,尤其适合处理大量文件的个人用户及企业环境,是提高工作效率、保持文件系统整洁的得力助手

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as npimport scipy.io as sioimport matplotlib.pyplot as pltimport statistics as statsimport pandas

Java中如何优化数据库查询性能?

Java中如何优化数据库查询性能? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java中如何优化数据库查询性能,这是提升应用程序响应速度和用户体验的关键技术。 优化数据库查询性能的重要性 在现代应用开发中,数据库查询是最常见的操作之一。随着数据量的增加和业务复杂度的提升,数据库查询的性能优化显得尤为重

如何用外呼工具和CRM管理系统形成销售闭环

使用外呼工具和CRM管理系统形成销售闭环是一个系统性的过程,它涉及客户数据的整合、个性化的营销活动、销售与市场活动的协作、顾客行为的追踪与理解以及营销成效的评估与优化等多个环节。 以下是如何将外呼工具和CRM管理系统有效结合以形成销售闭环的步骤: 1. 客户数据的整合与分析    - 外呼工具在与客户进行初步沟通时,会收集到客户的基本信息和初步需求。    - 这些信息随后被输入到CRM管

53、Flink Interval Join 代码示例

1、概述 interval Join 默认会根据 keyBy 的条件进行 Join 此时为 Inner Join; interval Join 算子的水位线会取两条流中水位线的最小值; interval Join 迟到数据的判定是以 interval Join 算子的水位线为基准; interval Join 可以分别输出两条流中迟到的数据-[sideOutputLeftLateData,