概述
众所周知,做benchmark测试,一般都采用ab,wrk,siege等工具。但是对于长连接,尤其是有信息交互的场景,这些工具很难做到。对于websocket的压力测试,更是很难得出有效的结果。
这里我参考了nodeJS库中的keepaliveAgent的压力测试的方法。也就是写一个proxy。原理如下:
实际应用时,http压测工具将压力打在proxy上,proxy将压力转给被压测的Server。这样由于我们可以在proxy自定义交互信息,故而使压测更加灵活。
环境准备
1、压测的client,由于多是http的短链接,需要配置的是:max-files、port-range
2、proxy,也会有http短链接和http长连接,需要配置的是:max-files,port-range
3、被压测的server,如果没有大量向外的主动连接,一般只需要:max-files
Linux:
最大文件打开数配置:
由于用户文件打开数量受限于三者:ulimit,pam_limit,sysctl。
ulimit 可以设置和查看当前用户登录shell的资源限制。
pam_limit 用于设置当前用户登陆的资源限制初始值。修改pam_limit后,需要用户重新登陆才可应用。
sysctl中fs.file-max是系统内核对于文件打开数量的限制。我作死把它改成10后。。不管干什么都会收到 too many file open。但是这个全局值不会影响ulimit的设定。也就是说,即使file-max设置为10,ulimit也可以设置为10000。只是打不开这么多的文件。。
端口范围:
同样修改 sysctl 中的 net.ipv4.ip_local_port_range = 32768 59000 即可
Mac:
最大打开文件数配置:
mac同样比较复杂,可以参考这篇文章
Mac OS X下的资源限制wudaijun.com文章大概讲了,使用ulimit,launchctl,sysctl等方式修改。最好是使用launchctl 加载 plist 的方式。
端口号限制配置:
修改 /etc/sysctl.conf
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535
100%的CPU
经过前面的一通准备,我开始测试我的proxy功能了。简单描述一下环境,压测客户端运行于mac,proxy和被压测服务器分别位于不同的linux机器。三者位于同一局域网。
压测客户端通过wrk指向proxy。由于wrk用了多线程固定连接数的设置,proxy很容易就达到了单核100%的CPU使用量。这个问题很容易解决,即使用PM2的cluster模式,将http请求分散到多个work上。
小Tips:PM2的cluster模式,只适用于简单http请求,而对于websocket这种,多段式的请求,master很容易将多个请求分配给不同的worker,导致websocket建立失败。其解决办法也很简单,可以使用nginx,或者抛弃PM2,自己写一个HASH(IP:PORT)的分配算法。
过多的TIME _WAIT
由于http建立的连接多数由web服务器来关闭,故web服务器会存在很多的TIME_WAIT状态。这个属于正常现象。
小Tips:查看TCP状态
| grep
其实可以不去调优,可以参考这篇文章:
爬上墙头:系统调优你所不知道的TIME_WAIT和CLOSE_WAITzhuanlan.zhihu.com使用HttpAgent
wrk有固定连接数的设定,而我的proxy还没有。使用[keepaliveAgent],将最大连接数设定为500,keepalive设置为true,超时时间设置为3s(通用标准keepalive时间为5s,过了这个时间,该连接就会被服务器给关闭)。
这里有一些思考:其实大多数应用,大多数http请求都是会发往同一个地址,这时候如果可以复用该tcp连接,就可以轻易减小请求的延迟和增大吞吐量。这一点,keeapaliveAgent的benchmark测试可以证明。
内存溢出
在没有特殊设置的情况下,node进程的所使用内存大小限制是1.4G。但是我在测试中发现,node进程在占用内存4个G的情况下依然在运行。查阅资料,实际上这个1.4G是javacript所使用内存大小,而如果你使用了C++模块,其内存控制不由V8引擎控制,这部分内存不算在限制中。
NAT端口限制
使用公司内网,压力测试线上服务器,会发现几百个连接之后,就无法进一步增加压力了。这个原因可能有很多,我这边主要关注带宽和NAT限制问题。
带宽问题可以通过netcat和pv两个工具测速。并使用nethogs观察压力测试时的带宽使用情况。
NAT问题是由于公司出口公网地址所能使用的端口号是全公司共享的,如果一个人占用了几万个端口号,就会造成公司其他人的断网。故。。联系IT部门,或使用线上服务器压测。