Node稳定性及压力测试
创建:2022-12-09 16:39 更新:2022-12-09 17:08
node.js使用了一个事件驱动、非阻塞性的I/O模型,使其轻量又高效。 当在Node开发中如果不开启多进程的情况下,所有的请求都会走同一份JS的代码并且只有一个线程去执行该JS代码,如果其中一个用户导致JS代码崩溃,Node进程就挂掉,整个Server端就挂掉了 通常为了保证性能往往会开启Node的多进程,Node中有提供Child_process模块,这个模块中,提供了多个方法来创建子进程
const { spawn, exec, execFile, fork } = require('child_process');
这4种方法都能创建子进程来执行计算,不过在使用上每种方法都有一些不同
命令 | 使用方法 | 解析 |
---|---|---|
spawn | spawn('node',['worker.js']) | 启动一个子进程来执行命令 |
exec | exec('node worker.js',(err,stdout,stderr)=>{}) | 启动一个子进程来执行命令,有回调 |
execFile | execFile('worker.js') | 启动一个子进程来执行可执行的文件 |
fork | fork('worker.js') | 与spawn类似,不过这里只需要自定义js文件模块即可 |
在开启多进程计算后,我们都需要从子进程获取到计算的结果,主进程和子进程之间是通过IPC(进程间通信)进行通信的,IPC也是由底层的Libuv根据不同的操作系统来实现的,除了Node提供的child_process模块以外,Node提供了cluster模块,不仅提供了开箱即用的能力去使用服务器的多核CPU,而且还提供一个零停机时间重新启动整个应用程序的能力,提高了Node进程的可用性。cluster模块基于主进程分发请求到子进程,支持负载均衡。PM2进程管理工具会讲这个过程变得更容易执行 传统的Node服务启动方式是node index.js来启动Node服务的,这种方式的弊端就是像上文所说当一个用户导致js文件出错以至于server服务挂掉时没办法自动重启,整个服务都不能使用了,这在生产中是绝对不能出现的。在生产中我往往使用PM2进程守护,可以零秒重启,以及日志管理,上面提到的cluster模块也能完成。但PM2使这变得更简单不需要去改动代码。
npm install -g pm2 --安装PM2
pm2 start app.js --启动
常用的PM2命令
$ pm2 start app.js
$ pm2 start app.js -i 4
$ pm2 start app.js --name="api"
$ pm2 start app.js --watch
$ pm2 start script.sh
$ pm2 list
$ pm2 monit
$ pm2 show [app-name]
$ pm2 logs
$ pm2 logs [app-name]
$ pm2 flush
项目压力测试方案 Node的接口压力测试方案以普通的其他压力测试基本相同,本次用到了以下两个 jmetter autocannon jmetter是常见的压力测试工具,通过设置好接口地址以及端口后,设置进程数量线程数量等参数后就可以直接生成测试报告,比较简单。