跳到主要内容

pm2配置理解

node进程实例内存问题​

worker 指的是“一个 Node 进程”, 多个worker表示多个node进程

  • instances: 'max'
    • 说明 PM2 会按 CPU 核数启动多个 Node worker。对于轻量接口服务这是常见默认值,但对于SSR 较重的项目,会导致多个高内存 worker 同时运行,放大总内存占用
    • 更容易出现多 node 进程实例 同时挤爆内存
  • 未显式配置 node_args
    • 没有设置 --max-old-space-size,意味着 Node 堆大小完全依赖默认策略,出现高峰请求时缺少明确内存缓冲
  • 未配置 max_memory_restart
    • 没有 PM2 的按内存自动重启兜底,一旦某个 worker 持续涨内存,就容易等到 Node 自己 OOM 崩溃。

instances配置​

决定启动多少个 Node worker。

  • 1:1 个 Node 进程
  • 2:2 个 Node 进程
  • 'max':按 CPU 核数尽可能多启动

instances: 'max' 那通常会按 CPU 核数跑多个,比如:

  • 4 核机器,可能起 4 个
  • 8 核机器,可能起 8 个

但代价是:

  • 每个 worker 都会单独占内存
  • 不是共享同一份堆内存

worker理解​

  • 1 个 worker = 1 个 Node 服务进程
  • 多 worker = 多个 Node 服务进程一起分担请求
  • worker 越多,总内存占用就越大

它们的作用是:

  • 提高并发处理能力
  • 一个进程忙时,别的进程还能接请求

node_args和max_memory_restart理解​

  • node_args:控制 Node.js 进程本身怎么运行
    • Node:给 V8 老生代 Heap 堆上限
    • '--max-old-space-size=4096':每个 worker 的 V8 老生代上限约 4GB,不是启动就占满,也不是进程总内存上限
  • max_memory_restart:控制 PM2 什么时候把进程重启
    • 比如设置了max_memory_restart为2G,表示超过2G就会重启

理解V8的Heap堆​

  • V8 的 Heap堆可以理解为“专门放 JavaScript 对象的内存”
  • V8 为了让垃圾回收更高效,会把 Heap 大致分成两类:
text
V8 Heap
├── 新生代 New Space
└── 老生代 Old Space

端口配置​

  • pm2配置env指定端口
  • 通过环境env参数来切换端口
    • pm2 start ecosystem.config.js --env pre
    • pm2 start ecosystem.config.js --env prod
text
env: {
"PORT": 3000,
"NODE_ENV": 'production',
},
// 预发布环境
env_pre: {
"PORT": 3001,
"NODE_ENV": "production",
},
// 生产环境
env_prod: {
"PORT": 3002,
"NODE_ENV": "production",
},

配置案例1​

比如服务器机器内存

  • 总内存约 7.3G
  • 可用内存约 4.8G
  • 没有 swap

pm2配置

  • 不建议 instances: 'max', 会启动多个 Node 进程, 风险太高,多 worker 同时跑重 SSR 请求,会把内存压力快速放大

推荐配置:

  • instances: 2
    • PM2 会启动 2 个 Node worker 进程
  • node_args: '--max-old-space-size=1536'
    • 每个 Node 进程 的 V8 JS 堆上限大约是 1536MB
  • max_memory_restart: '1800M',
    • 每个进程 的总内存如果超过 1800MB
    • PM2 就会把那个进程重启