Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

【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,但会出现warning
      WARNING: 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秒
    • 所以
      • 多核情况下,开启集群的效果还是比较明显