新建
在内存充足的情况下,内存的主频、CPU的主频、架构对新建起决定性作用。新建是一个不断删除重新建立的过程,每秒都保持着同样的速度新建删除,而测试每条新建DUT都只需要转发6个数据包具体过程如下:
三次握手 |
传输控制模块TCB:它用于记录TCP协议运行过程中的变量。对于有多个连接的TCP,每个连接都有一个TCB。TCB结构的定义包括这个连接使用的源端口、目的端口、目的IP、序号、应答序号、对方窗口大小、己方窗口大小、TCP状态、top输入/输出队列、应用层输出队列、tcp的重传有关变量。 |
Piggyback Get Request:使GET请求和ACK报文合并 |
并发
在CPU的性能充足的情况,CPU的内存大小对并发的起决定性作用。并发是一个边建边拆的过程,每一条新建立的连接都会保持一段固定的时间(该时间可以在290中配置)然后再删除,并且每秒新建数不能大于实际新建性能,而测试并发每条TCP连接DUT都只需要转发9个数据包,其具体过程如下:
维持阶段的参数设置时间,在这一期间,客户端收到服务器的回复页面数据后,会立即收到服务器发来的FIN报文关闭连接,然后客户端会立即发送GET请求再次建立连接,使得连接数目保持在压力值。 |
Time-Wait也称为2MSL等待状态,当一端发起主动关闭,在第3次握手完成后发送了第四次握手的ACK包后就进入该状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。 |
脚本参数
这个阶段的设置需要大概估计测试设备的并发能力和新建能力,为测试选取一个并发高度,并设置一个爬坡时间,这两个值需要保证的新建速率低于最大新建能力。此处的爬坡时间记为A。
一般地,维持时间不能低于60秒(标准),这一阶段并发压力要维持在设定的并发值,这一阶段,在连接达到Latency,会收到服务器的FIN报文,然后客户端继续发送请求以维持设定的并发压力值。
释放时间需要设置为大于爬坡时间,记为C。
Latency,设为B,该值表示客户端发送完请求后,服务器延时Latency设定的时长才回复请求的页面数据,Latency必须满足AC,会出现服务器FIN报文还未发送完毕,测试已经结束的情形。
新建:异常重启
RST异常关闭后,存储在路由器设备中的连接值并不是立即消失,而是需要等待一定时间,这个时间与路由器连接参数nf_conntrack_tcp_timeout_close_wait相关联。
依旧从内存和cpu两方面分析,先看内存,内存的占用主要是大量的连接缓存的建立所致,在新建过程,路由器设备中最大的连接数目为新建测试值nf_conntrack_tcp_timeout_close_wait,然后可以通过每条连接所占内存,大概得知测试某个新建测试时,内存是否充足。
一般来说,新建测试的瓶颈是在于cpu的。常常会有这种现象,测试新建的过程中,系统因内存不足而激活oom-killer,导致重启。这时由于cpu占满后,路由器丢弃了客户端的RST报文,使得连接保持在established状态,而established状态想要等到连接清除,时间一般比较长,该时间取决于连接参数nf_conntrack_tcp_timeout_established。大量的连接无法凭借RST报文进行异常关闭而累积,最终导致内存耗尽。
性能差距排查
由于新建、并发本身是统计每秒能新建的最大连接数目和可以维持的最大连接数目,两者都是基于连接进行的统计,所以对于连接跟踪的参数调整也能够对新建、并发性能起到一定的提升作用,这里提出两个在测试过程中调整的较多的参数(连接跟踪参数位于/proc/sys/net/netfilter/目录下):
1) 最大连接数目限制nf_conntrack_max
在许多初始版本软件中,未对此参数进行调整,使得新建、并发性能受到限制,该参数具体的限制分析如下:
a) 新建
内存和cpu足够的情况下,假设nf_conntrack_max=20000,如果测试新建值为4000,连接维持时间为5秒,那么可以算得5秒后实际连接最大数目可达到20000,再加上系统干扰的连接数目(大约在30~50个之间),此时实际最大连接数目超过了限定值,导致测试失败。
b) 并发
由于本身测的就是最大连接数目,所以nf_conntrack_max对并发有着直接的影响。
设置、查看最大连接数
echo 25000 > proc/sys/net/nf_conntrack_max
cat /proc/sys/net/nf_conntrack_max
清除缓存中的连接
echo 2 > /proc/sys/vm/drop_caches
2) 连接超时关闭时间nf_conntrack_tcp_timeout_close
在空闲内存剩余不多的情况下,该参数对于新建的影响较大,若nf_conntrack_tcp_timout_close=10时,假设测试新建值为4000,那么10秒之后最大的连接数目可达到40000个, 若nf_conntrack_tcp_timeout_close=5,则5秒之后最大连接数目为20000个,缓存一下可减少一半。所以在内存不大的情况下,适当降低该值,可以大大提升新建数目。
3) 连接跟踪hash表的大小nf_conntrack_htable_size
在自由内存剩余足够,cpu不足的情况下,该参数对并发的影响较大,将nf_conntrack_htable_size增大时,在检索此表的时候可以增大命中率,减少查询次数,从而降低cup使用率,提高并发数据。将nf_conntrack_htable_size=16384 修改增大4倍时,可将并发从80000提高到92000将近提升15%。若内核原始环境造成的差异也确定之后,再判断是否是本产品在内核所加模块或对内核进行的改动对性能有影响,例如行为管理,fastnat,负载均衡,online_ip等模块。可以通过卸载对应模块测试各个模块对性能的影响
3.以上问题解决后,可以通过调整连接跟踪参数,保证连接跟踪参数与硬件性能相匹配,来实现新建、并发性能的最优化。