基于TSUNG对MQTT进行压力测试-基础概念温习

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 基于TSUNG对MQTT进行压力测试-基础概念温习

一、TCP报头部中的SYN、FIN、ACK:


dfed862ea84cb7aeb5dbb38bf42ca845.png


ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。


SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文。


FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。


二、一个TCP连接从开始到断开的几个状态


95238e1af08ad4fd78312189f7282509.png

600c6b4016f1a644663f047952272017.png



SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。


状态:描述


CLOSED:无连接是活动的或正在进行


LISTEN:服务器在等待进入呼叫


SYN_RECV:一个连接请求已经到达,等待确认


SYN_SENT:应用已经开始,打开一个连接


ESTABLISHED:正常数据传输状态


FIN_WAIT1:应用说它已经完成


FIN_WAIT2:另一边已同意释放


ITMED_WAIT:等待所有分组死掉


CLOSING:两边同时尝试关闭


TIME_WAIT:另一边已初始化一个释放


LAST_ACK:等待所有分组死掉


三、TCP的发送缓冲区和接收缓冲区

TCP协议是作用是用来进行端对端数据传送的,那么就会有发送端和接收端,上篇博客讲了Socket默认是阻塞式的,在操作系统有两个空间即user space和kernal space。


每个Tcp socket连接在内核中都有一个发送缓冲区和接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。


单工:只允许甲方向乙方传送信息,而乙方不能向甲方传送 ,如汽车单行道。


半双工:半双工就是指一个时间段内只有一个动作发生,甲方可以向乙方传送数据,乙方也可以向甲方传送数据,但不能同时进行,如一条窄马路同一时间只能允许一个车通行。


全双工:同时允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。


一个socket的两端,都会有send和recv两个方法,如client发送数据到server,那么就是客户端进程调用send发送数据,而send的作用是将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回。


也就是说send()方法返回之时,数据不一定会发送到对端即服务器上去(和write写文件有点类似),send()仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中,发送是TCP的事情,和send其实没有太大关系。


接收缓冲区把数据缓存入内核,等待recv()读取,recv()所做的工作,就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面,并返回。若应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。对于TCP,如果应用进程一直没有读取,接收缓冲区满了之后,发生的动作是:收端通知发端,接收窗口关闭(win=0)。这个便是滑动窗口的实现。保证TCP套接口接收缓冲区不会溢出,从而保证了TCP是可靠传输。因为对方不允许发出超过所通告窗口大小的数据。 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。


查看socket发送缓冲区大小,cat /proc/sys/net/ipv4/tcp_wmem


四、限制连接数上涨的几个关键因素:

系统端口限制


Linux系统端口为short类型表示,数值上限为65535。假设分配压测业务可用端口范围为1024 - 65535,不考虑可能还运行着其它对外连接的服务,真正可用端口也就是64000左右(实际上,一般为了方便计算,一般直接设定为50000)。换言之,即在一台机器上一个IP,可用同时对外建立64000网络连接。


若是N个可用IP,理论上 64000*N,实际上还需要满足:


充足内存支持

tcp接收/发送缓冲区不要设置太大,tsung默认分配32K(可以修改成16K,一般够用了)

一个粗略估算假设一个用户占用内存50k,1w用户占用500M内存,假设需要100w用户

100w/6w = 17个IP地址 ;500m * 100w/1024 = 50G内存 ;服务器单一IP 承载100万用户:1台主机+17台从机 ;若单机64G内存+17个IP可用IP地址 就一台就能搞定。


为多IP的压测端分配适合的权重,以便承担更多的终端连接

Linux系统打开文件句柄限制


系统打开文件句柄,直接决定了可以同时打开的网络连接数量,这个需要设置大一些,否则,你可能会在tsung_controller@IP.log文件中看到error_connect_emfile类似文件句柄不够使用的警告,建议此值要大于 > N * 64000。


修改linux系统参数。vi /etc/security/limits.conf 添加


*       soft    nofile  655350


*       hard    nofile  655350


*       soft    nproc  655350


*       hard    nproc  655350


修改以后保存,注销当前用户,重新登录,执行ulimit -a ,ok ,参数生效了:


注:nofile是代表最大文件打开数


nproc是操作系统级别对每个用户创建的进程数的限制


内存的影响:


一个网络Socket连接占用不多,但上万个或数十万等就不容小觑了,设置不当会导致内存直接成为屏障。


TCP接收、发送缓存


Tsung默认设置的网络Socket发送接收缓冲区为16KB,一般够用了。


[root@bogon ~]# cat /proc/sys/net/ipv4/tcp_rmem


4096 87380 4194304


此值会覆盖Linux系统设置接收、发送缓冲大小。


粗略的默认值计算,一个网络连接发送缓冲区 + 接收缓冲区,再加上进程处理连接堆栈占用,约40多K内存,为即计算方便,设定建立一个网络连接消费50K内存。


先不考虑其它因素,若我们想要从机模拟10W个用户,那么当前可用内存至少要剩余:50K * 100000 / 1000K = 5000M = 5G内存。针对一般服务器来讲,完全可满足要求(剩下事情就是要有两个可用IP了)。


五、服务器查看TCP连接数

命令:ss  -tan|awk 'NR>1{++S[$1]}END{for (a in S) print a,S[a]}’


通过上述命令可以统计出TCP连接中处于各个状态的连接数,在经过Ng代理之后需要真实的连接数需要除以2,因为Client——Nginx——Mqtt其实算是两个TCP连接。


单台Broker压测结果见:http://www.cnblogs.com/lingyejun/p/7941271.html


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
消息中间件 分布式计算 大数据
大数据-123 - Flink 并行度 相关概念 全局、作业、算子、Slot并行度 Flink并行度设置与测试
大数据-123 - Flink 并行度 相关概念 全局、作业、算子、Slot并行度 Flink并行度设置与测试
107 0
|
4月前
|
测试技术 API 数据库
性能测试概念
**性能测试评估系统在负载下的表现,关注响应时间、吞吐量、并发用户数和资源利用率。关键指标包括RT、HPS、TPS、QPS、RPS等。并发数可由QPS和平均响应时间计算。提升压力的技术手段涉及多进程、多线程,各有优劣。P90、P95、P99等分位数用于描述数据分布,揭示不同负载场景下的系统性能。**
|
1月前
|
测试技术 网络安全
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
文章全面介绍了软件测试的基本概念、目的、岗位分类、与开发和调试的区别,并阐述了成为优秀测试人员应具备的素质和技能。
179 1
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
|
1月前
|
分布式计算 Hadoop Unix
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
42 1
|
1月前
|
前端开发 测试技术 程序员
在工作中会涉及到的几个环境(概念补充) 办公环境、开发环境、测试环境、线下环境、线上环境/生产环境都是什么,他们之间的关系?
本文解释了在职场中可能会接触到的不同环境,包括办公环境、开发环境、测试环境和生产环境(线上环境),以及它们之间的关系和重要性。
66 1
|
6月前
|
NoSQL 关系型数据库 MySQL
涉及rocketMQ,jemeter等性能测试服务器的安装记录
涉及rocketMQ,jemeter等性能测试服务器的安装记录
71 1
|
3月前
|
Kubernetes 监控 Java
发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
403 0
|
5月前
|
消息中间件 测试技术 Apache
消息队列 MQ产品使用合集之在测试环境中拥有大量的topic会有什么影响
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
114 1
|
6月前
|
测试技术
软件测试概念与基础
软件测试概念与基础
|
5月前
|
消息中间件 Java RocketMQ
RocketMQ搭建并测试(windows)
RocketMQ搭建并测试(windows)
879 0