测试网络的带宽指令_单机千万级MQTT服务器测试报告

f80c54897a5f5f6aaef6c4cb3a5e542e.png

目标:测试创建1000万客户端连接到Coolpy7 MQTT服务器端,服务器操作系统 Linux(任意一款发行版服务器版本)。分别在两台硬件一样的服务器,其中一台用于服务器端运行,另一台用于创建千万客户端连接客户端机器。在硬件一致的情况下请确保网络设备达到相关测试要求,例如万兆网络等等。

541057cd0c8c819005ecb3aecaee0778.png

服务端系统参数调优(Linux)

修改文件/etc/sysctl.conf,配置网络参数。

net.ipv4.tcp_wmem = 4096 87380 4161536

net.ipv4.tcp_rmem = 4096 87380 4161536

net.ipv4.tcp_mem = 786432 2097152 3145728

fs.file-max = 12000000 #一千两百万

执行/sbin/sysctl -p即时生效。

echo 12000000 > /proc/sys/fs/nr_open #需root权限

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

DefaultLimitNOFILE=12000000

修改/etc/security/limits.conf文件

* hard nofile 12000000

* soft nofile 12000000

* soft nproc 12000000

* hard nproc 12000000

需重启系统生效,服务器操作系统参数调优完成。关于启动CoolPy7服务器端程序请参阅本章中的《程序安装》小节

客户端的参数调优(Linux)

根据TCP/IP协议,由于端口是16位整数,也就只能是0到 65535,而0到1023是预留端口,所以能分配的端口只是1024到65534,也就是64511个。一台机器一个IP只能创建六万多个长连接。 要想达到更多的客户端连接,可以用更多的机器或者网卡,也可以使用虚拟IP来实现,比如下面的命令增加了19个IP地址,其中一个给服务器用,其它18个给client,这样可以产生18 * 60000 = 1080000个连接。本测试用例需要增加到一千万或以上的足够IP。

9c15f4cdf1807233622970ac44805716.png

以上指令查看到网卡名称为 eth0

eea6a46ed8e7bb0ca266e5f57d02120d.png

以上指令操作增加虚拟IP,添加完成后通过 ifconfig 指令查看确认所有虚拟IP最已列出。

修改/etc/sysctl.conf文件:

fs.file-max = 12000000

fs.nr_open = 12000000

net.ipv4.ip_local_port_range = 1024 65535

执行/sbin/sysctl -p即时生效。

echo 12000000 > /proc/sys/fs/nr_open #需root权限

/etc/security/limits.conf配置

* soft nofile 12000000

* hard nofile 12000000

* soft nproc 12000000

* hard nproc 12000000

# 下载测试工具

git clone https://github.com/Coolpy7/coolpy7_benchmark.git

# 进入bin文件夹

cd bin

# 启动Coolpy7静连接测试工具

# 参数url: Coolpy7服务端所在服务器ip地址,默认端口号:1883

# 参数workers: 需要创建的客户端连接数量

# 参数cid: mqtt连接客户端(ClientId)前缀,工具会自动以cid+WorkersId作为连接clientid值

# 参数topic: 连接成功后订阅的topic主题(支持以%i取得workersid:例: mytopic%i)不进行订阅测试填写null字符串

# 参数keepalive: 连接ping时间间隔

# 参数clear: mqtt客户端连接的clearsession属性,当设置为true时重连时不能再次订阅qos0以上的主题

# 以下例示建立连接到192.168.200.238所在的Coolpy7服务器端,并创建400万个MQTT客户端连接

./go_build_cp7_bench_sub_go_linux -workers=4000000 -cid=tqy -topic=null -qos=0 -url=tcp://192.168.200.238:1883 -keepalive=60000s -clear=true

2fa98ced0594b5d688a4a86539cc9c89.png

测试时需时刻关注服务器端网络资源使用情况,测试数据显示在高连接数下ping/pong状态下已占用极大的网络带宽,需根据当前设备的硬件资源合理设置最大连接数量以保证系统的稳定长期运行

5d244f40f49a17ea696420dd57b66a96.png

服务器端启动并host于1883 TCP端口

b1f93c5d2d3d8d32b8ac7fe34638c5fb.gif

通过HTOP工具监测Coolpy7(连接时)硬件资源占用情况

e9983a719aaeaf1658b14e511bb46c6f.gif

通过NLOAD工具监测Coolpy7(连接时)网络资源占用情况

73a331b2d5d85e81021a39bc2a5f825e.png

使用Coolpy_benchmark工具测试连接400万连接

  1. 测试工具开源地址:https://github.com/Coolpy7/coolpy7_benchmark
  2. 工具会以1000为单位打印连接信息
  3. 工具启动后会一直创建参数指定的客户端连接数

按应用场景测试

MQTT 是一个设计得非常出色的传输层协议,在移动消息、物联网、车联网、智能硬件甚至能源勘探等领域有着广泛的应用。1个字节报头、2个字节心跳、消息 QoS 支持等设计,非常适合在低带宽、不可靠网络、嵌入式设备上应用。

不同的应用有不同的系统要求,用户使用Coolpy7消息服务器前,可以按自己的应用场景进行测试,而不是简单的连接压力测试:

  1. Android 消息推送: 推送消息广播测试。
  2. 移动即时消息应用: 消息收发确认测试。
  3. 智能硬件应用: 消息的往返时延测试。
  4. 物联网数据采集: 并发连接与吞吐测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看redis aof内存_Redis持久化问题定位与优化技巧

今天主要分享继Redis持久化方式RDB、AOF之后的一些常用的Redis问题定位于优化方式。这里主要CPU、内存、磁盘在三个维度去分析问题!Fork操作当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创建子进程,对于大多数操作系统来说fo…

windows设置mysql使用率_Windows下配置Mysql

这里说的配置Mysql,是在安装时进行的,请先查看:Windows平台下安装Mysql紧接上文,安装完成后将配置选项打上对勾,按下“Finish”,出现下面的界面,这里有一个很好的功能,mysql配置向导…

mysql 云无忧ps教程_华为云数据库MySQL一键开通读写分离,无忧应对企业业务高峰情景...

业务大促,订单暴增,网站流量暴涨几倍,数据库服务器容量又要扛不住了,眼睁睁看着生意白白溜走,再苦逼也无法解决,“肿”么办?别担心,一键开通读写分离,而且只需一个连接地…

python 基因序列提取_科学网—简单的Python脚本提取对应位置基因序列(fasta文件) - 王彬忠的博文...

最近,用Python脚本提取,在基因号已知,位置已知条件下,相对应位置的基因序列时发现,这样很简单但是很实用的脚本,在网上却比较难找。而且,能被找到的脚本,相对于具有初级编程能力的人…

python是强定义语言吗_python是强类型语言吗

强弱是对类型而言的。强类型,你有一个值之后这个值是什么类型是确定,比如n1,n的类型是确定的(字符串),因此你不能在Python做n3 mn1运算。而弱类型就不是这样的,值的类型可以在需要的时候再去确定,比如PHP里…

深入java核心_Java核心(五)深入理解BIO、NIO、AIO

导读:本文你将获取到:同/异步 阻/非阻塞的性能区别;BIO、NIO、AIO 的区别;理解和实现 NIO 操作 Socket 时的多路复用;同时掌握 IO 最底层最核心的操作技巧。BIO、NIO、AIO 的区别是什么?同/异步、阻/非阻塞…

java arraylist底层实现原理_ArrayList和LinkedList底层原理

ArrayList和LinkedList都是List的实现类,是在日常开发中经常被使用到的两个集合,我们来结合源码看下两个集合的不同之处。先来看下ArrayList的源码:// 默认的初始化大小private static final int DEFAULT_CAPACITY 10;ArrayList的底层数数组…

java 3_Java 3 (Java的数据类型)

Java的数据类型主要内容:1Java数据类型的分类2.8种基本数据类型3.理解引用类型的特点一、什么是数据类型?计算机语言将数据按性质进行分类,每一类称为一种数据类型;数据类型定义了数据的性质、取值范围、存储方式、对数据所能进行…

java replace stringbuilder_java.lang.StringBuilder.replace()方法实例

全屏java.lang.StringBuilder.replace()方法按照这个顺序,在指定的字符串的子字符串替换字符。子串开始在指定start的 索引,并延伸到该字符 end - 1,或如果序列的末端不存在这样的字符。声明以下是java.lang.StringBuilder.replace()方法的声…

中小学课java_java毕业设计_springboot框架的中小学排课与实现

这是一个基于java的毕业设计项目,毕设课题为springboot框架的中小学排课与实现, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse, 项目框架jspspringbootmybatis, 中小学排课与实现采用mysql进行数据存储, 并基于mybatis进行了orm实体关系映射, 该中小学排课与实现…

制作自己的 Docker 容器

软件开发最大的麻烦事之一,就是环境配置。用户必须保证操作系统的设置,各种库和组件的安装,只有它们都正确,软件才能运行。docker从根本上解决问题,软件安装的时候,把原始环境一模一样地复制过来。 以 koa-…

matlab差分算子的灰度图像边缘检测,常用图像边缘检测方法及MATLAB研究

论文2 1年 2月 I 01 5日现代电子技术M o e n El c r i sT e h qu d r e ton c c ni e第3 4卷第 4期Fe .2 11 b 0 Vo1 3 . . 4 NO 4常用图像边缘检测方法及 Malb研究 t a韦炜(安文理学院,陕西西安西 706 ) 1 0 5({№吨~一~一一一三一一垂”. ; _堇;~~ _一…

php %3c%3c%3cxml 报错,代码审计| APPCMS SQL-XSS-CSRF-SHELL

0x01 背景由若水师傅提供的一个素材,想要复现CNVD上披露的一个APPCMS的漏洞,由CNVD上的描述可以知道存在漏洞的地方是comment.php这个文件,然后就没有详细的漏洞信息了,所以就需要分析相应的源码文件找出存在漏洞的点。借这个素材…

php二进制保存到本地,C# 将二进制字符串保存到本地

C# 将二进制字符串保存到本地#region 将文件保存到本地/// /// 将文件保存到本地/// /// 文件的二进制数据字符串/// 文件名称,必须带后缀private void SaveFile(string psContent, string psFileName){byte[] accessory Convert.FromBase64String(psContent);//Sy…

suse 安装oracle11,Suse11安装Oracle11gR2

注:以下采用终端XmanagerEnterprise 4中的Xshell连接1、安装前参数修改vi /etc/security/limits.conf --末尾添加如下oracle soft nproc 2047oracle hard nproc 16384oracle soft nofile 1024oracle hard nofile 65536vi /etc/sysctl.conf --末尾添加如…

oracle 超市管理系统,SuperManager 超市账单管理系统 JSP + Servlet + Oracle Jsp/ 240万源代码下载- www.pudn.com...

文件名称: SuperManager下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 2144 KB上传时间: 2015-07-07下载次数: 0详细说明:超市账单管理系统JSP Servlet Oracle-超市账单管理系统JSP Servlet Oracle文件列表(点击判断是否您需要的文件,如果是…

linux命令行的操作符,如何在Linux命令行中进行基本的数学运算

原标题:如何在Linux命令行中进行基本的数学运算Linux bash或命令行允许您执行基本和复杂的算术和布尔运算。像expr,jot,bc和factor等命令可以帮助您找到复杂问题的最优数学解决方案。在本文中,我们将描述这些命令并提供示例&#…

linux什么用户什么任务,linux任务里的1 和2是什么意思

输出学过代码的小伙伴应该知道STDIN、STDOUT、STDERR通常都是指定输出通道的,perl里又称之为句柄那么1代表的就是STDOUT、2代表的是STDERR、jimmy在视频中会翻译成1代表的是正确输出,2代表的是错误输出。其实严格上不能这样去固有化去理解每一个软件的定…

linux .desktop权限,如何在Ubuntu Xenial Xerus 16.04 Linux Desktop上以root用户身份登录

您可能已经注意到,默认情况下,Ubuntu Xenial Xerus 16.04 Linux Desktop不具备以root管理员用户身份登录的功能。每次尝试以root用户身份在终端上登录都会导致Login incorrect错误信息:。默认的Ubuntu Linux桌面行为的背后原因是,…

2048游戏c语言linux简易代码,C语言实现2048游戏代码

本文实例为大家分享了C语言实现2048游戏具体代码,供大家参考,具体内容如下效果图:使用文本界面的屏幕绘图库 ncurses.设计思路:在满足条件情况下消除方块允许在游戏主界面(16 宫格)中任意一格输出数据实现代码:#include #include #include #include #inc…