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

[单台Broker压测结果]请移步另外一篇博客:http://www.cnblogs.com/lingyejun/p/7941271.htmlhtml

1、TCP报头部中的SYNFINACK

ACK : TCP协议规定,只有ACK=1时有效,也规定链接创建后全部发送的报文的ACK必须为1。linux

SYN(SYNchronization) : 在链接创建时用来同步序号。当SYN=1而ACK=0时,代表这是一个链接请求报文。对方若赞成创建链接,则应在响应报文中使SYN=1和ACK=1. 所以,  SYN置1就表示这是一个链接请求或链接接受报文。 web

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

2、一个TCP链接从开始到断开的几个状态

 

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

状态:描述网络

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

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

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

SYN_SENT:应用已经开始,打开一个链接操作系统

ESTABLISHED:正常数据传输状态

FIN_WAIT1:应用说它已经完成

FIN_WAIT2:另外一边已赞成释放

ITMED_WAIT:等待全部分组死掉

CLOSING:两边同时尝试关闭

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

LAST_ACK:等待全部分组死掉

3、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

 

4、限制链接数上涨的几个关键因素:

系统端口限制

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

如果N个可用IP,理论上 64000*N,实际上还须要知足:

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

100w/6w = 17IP地址 500m * 100w/1024 = 50G内存 服务器单一IP 承载100万用户1台主机+17台从机 若单机64G内存+17IP可用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系统设置接收、发送缓冲大小。

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

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

 

5、服务器查看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

相关文章
相关标签/搜索