mac上怎么运行node.js文件_记一次使用NodeJS做服务器压力测试

e1ada23d4b8cafefeadbf6bf75d4033f.png

概述

众所周知,做benchmark测试,一般都采用ab,wrk,siege等工具。但是对于长连接,尤其是有信息交互的场景,这些工具很难做到。对于websocket的压力测试,更是很难得出有效的结果。

这里我参考了nodeJS库中的keepaliveAgent的压力测试的方法。也就是写一个proxy。原理如下:

ee182d9f2a6e147c1b6a30dde9f396bd.png

实际应用时,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
8bc78f005343428383a8bdd94832ce65.png

文章大概讲了,使用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_WAIT​zhuanlan.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部门,或使用线上服务器压测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值