首页 > 其他分享 >基于TSUNG对MQTT进行压力测试-基础概念温习

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

时间:2022-12-13 13:02:00浏览次数:38  
标签:send SYN TCP TSUNG 接收缓冲区 MQTT 内存 温习 连接

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

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

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

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

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

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

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

 

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

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,理论上,实际上还需要满足:

  • 充足内存支持
  1. tcp接收/发送缓冲区不要设置太大,tsung默认分配32K(可以修改成16K,一般够用了)
  2. 一个粗略估算假设一个用户占用内存50k,1w用户占用500M内存,假设需要100w用户

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

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

Linux系统打开文件句柄限制

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

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

*   655350

*   655350

*   655350

*   655350

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

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

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

内存的影响:

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

TCP接收、发送缓存

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

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

4096 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压测结果见


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

作者:​​翎野君​


若本文如对您有帮助,不妨点击一下右下角的。


如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。


转载文章请务必保留出处和署名,否则保留追究法律责任的权利。



标签:send,SYN,TCP,TSUNG,接收缓冲区,MQTT,内存,温习,连接
From: https://blog.51cto.com/lingyejun/5933834

相关文章

  • java中OOM错误浅析(没有深入太多,一些粗浅的知识,可以温习用)
    嗯,生活加油鸭。。。。实习中遇到OOM错误GCoverheadlimitexceeded  问题,所以整理一下OOM异常问题:不对的地方请小伙伴留言^_^“阿里的开发手册”对OOM的描述:OOM,全称“......
  • 华普物联 HP-ERS-T200的 MQTT工作模式接入阿里云示例教程
    一、需准备事项:1、注册阿里云平台账号https://account.aliyun.com/login/login.htm2、设备接入阿里MQTT物联网平台参数计算工具http://www.hpiot.cn/index/Download/do......
  • 华普物联HP-E10的MQTT工作模式接入华为云示例教程
    示例操作流程1、注册并登录华为云https://auth.huaweicloud.com/authui/login.html#/login2、登录后,选择产品-->IoT物联网-->设备接入IoTDA  点击设备接入IoTDA3......
  • 物联网mqttfx-1.7.1下载
    关注微信公众号【工控羊】或者微信号【gksheep】,微信公众号后台输入数字编号【1006】即可获取下载链接。......
  • 【干货】超详细!TPC7062封装MQTT协议教程
    【干货】超详细!TPC7062封装MQTT协议教程一.功能简介通过将报文分解为16进制格式的字符串(比如:101C00044D51545404C2),再通过TPC-7062进行组包,利用串口服务器的TCP/IP协议栈连接......
  • MQTT 基础知识
    参考文档:https://mqtt.org/getting-started/MQTT是物联网(IoT)最常用的消息传输协议。MQTT是MQ遥测传输的缩写。该协议是一套规则,定义了物联网设备如何通过互联网发布和订阅......
  • 基于.net C# Socket WinForm MQTT 客户端开发
     1、什么是MQTT?MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议......
  • MQTT入门
    参考文档:http://docs.oasis-open.org/mqtt/mqtt/v5.0/csprd02/mqtt-v5.0-csprd02.htmlhttps://github.com/mcxiaoke/mqtt  摘要MQTT是物联网(IoT)最常用的消息......
  • 在华为云 OSC 上快速部署 EMQX MQTT 集群
    ​​EMQXKubernetesOperator​​是EMQ发布的一个封装、部署和管理工具,也是一个特定的应用控制器,方便DevOps人员在Kubernetes上编排EMQXMQTT消息服务集群,管理其......
  • MQTT生产实践总结与EMQX5.0探索
     引言之前做了一个系统,系统的一部分硬件设备是使用MQTT协议接入的,无奈只好去研究它。好不容拼凑出一套能用的代码,上生产以后频频出现故障,后来稀里糊涂的解决了,但是一直......