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 大致分成两类:
V8 Heap
├── 新生代 New Space
└── 老生代 Old Space
端口配置
- pm2配置env指定端口
- 通过环境env参数来切换端口
pm2 start ecosystem.config.js --env prepm2 start ecosystem.config.js --env prod
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 就会把那个进程重启