【pm2】集群开启
开启方法
-
pm2安装命令npm i -g pm2 -
【(不推荐)集群开启方法1】通过命令行
pm2 start index.js -i 4- 这里用
-i指定用4个核心创建 - 如果指定为0,那就会按照当前机器的CPU核心数创建
pm2 start index.js -i 0 - 如果用过node10环境的pm2,而不是node16,就需要强制指定参数为16的目录,否则运行出错(会用node10来跑你的node16代码!!!),当然重启也能解决问题
--interpreter="/Users/mangou/.nvm/versions/node/v16.11.1/bin/node"- 路径可以通过
which node查询
- 路径可以通过
- 如果成功,可以执行
pm2 log,但会出现warningWARNING: NODE_APP_INSTANCE value of '0/1/2/3/4/5' did not match any instance config file names.
- 这里用
-
【(推荐)集群开启方法2】根目录配上
pm2启动文件来执行- 在项目根目录创建
pm2.json,内容为{ "apps": [{ "name": "app", "script": "index.js", "instances": 0, "instance_var": "INSTANCE_ID", "exec_mode": "cluster" }] } - 换成
pm2 start pm2.json命令启动 - 如果要重启,执行
pm2 restart pm2.json
- 在项目根目录创建
-
pm2高级命令pm2 save- 把当前正在运行的所有pm2进程,保存起来(一般用于关机前)
pm2 resurrect- 把上面保存的pm2进程,全部恢复(一般用于重启后)
pm2集群开启的好处——性能对比
-
目前的机器是6核
- node默认的js引擎是单进程单线程运行,会使多核利用不够充分
-
测试准备
- 临时把文件打开数调高
ulimit -SHn 65536- 否则会出现错误
socket: Too many open files (24)
- 否则会出现错误
- 并发数最多只能达到150
- 否则会出现错误
apr_socket_recv: Connection reset by peer (104) - 原因
- 在高并发的情况下,内核会认为系统受到了SYN flood攻击
- 方法(只能用于linux)
vim /etc/sysctl.conf- 找到
net.ipv4.tcp_syncookies = 1- 对于大并发系统,要禁用此设置
- 要么改成0
- 要么整行注释掉
- 改完后执行
sysctl -p生效
- 对于大并发系统,要禁用此设置
- 找到
- 或者直接一个命令
sysctl -w net.ipv4.tcp_syncookies=0
- 否则会出现错误
- 临时把文件打开数调高
-
测试命令
ab -c 150 -n 1200 -H "x-access-token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3V1aWQiOiIxMTEiLCJkZXZpY2VfdXVpZCI6IjIyMiIsImlhdCI6MTYzOTU2MjE0NywiZXhwIjoxNjQ0NzQ2MTQ3fQ.FiZy1ws0YxQfoVCLfZ1H0YvjyawBzDAx92UAKa5NAwg" http://192.168.0.222:8060/api_v1/need_test_encrypt- 300个用户,每个用户600个请求
-
单进程开启的结果
Requests per second: 131.95 [#/sec] (mean) Time per request: 1136.771 [ms] (mean)- 一秒能处理131个请求
- 每个请求平均耗时1.13秒
50% 1114 66% 1120 75% 1125 80% 1131 90% 1140 95% 1149 98% 1156 99% 1168 100% 1346 -
集群下的结果
Requests per second: 152.56 [#/sec] (mean) Time per request: 983.190 [ms] (mean)- 一秒能处理146个请求
- 每个请求平均耗时1.02秒
50% 1031 66% 1097 75% 1132 80% 1156 90% 1215 95% 1261 98% 1304 99% 1358 100% 1456 -
对比结果
- 每秒处理从
131个提升到152个 - 请求平均耗时从
1.14秒降低到0.98秒 - 但是
- 请求处理的时间变得不均匀
- 单进程下,请求的处理事件都在1.1秒左右
- 集群下,请求有一半快的1秒,最慢的1.4秒
- 请求处理的时间变得不均匀
- 所以
- 多核情况下,开启集群的效果还是比较明显
- 每秒处理从