你的浏览器无法正常显示内容,请更换或升级浏览器!

Node.js 进程管理与 cluster 多核利用备忘

tenfei
tenfei
发布于2026-11-08 17:53 阅读10次
Node.js 进程管理与 cluster 多核利用备忘
记录 Node.js 如何利用 cluster 模块把单线程服务扩展到多核:主进程 fork 工作进程、端口共享与请求分发、崩溃自动重启,并总结工作进程内存不共享、session 需外部存储、惊群效应、定时任务重复执行等高频坑与进程管理建议。
# Node.js 进程管理与 cluster 多核利用备忘 Node.js 默认单线程,再多核服务器也只用到一个核,CPU 跑满而其余核在围观。cluster 模块是官方给出的水平扩展方案。本文记录用法与几个必须知道的坑。 ## 一、为什么需要 cluster Node 的事件循环跑在单个线程,计算密集任务会阻塞所有请求。多核机器上,靠 cluster 起多个工作进程,各自独占一个核,由主进程统一收口监听端口。 ## 二、最小可用结构 ```js const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { const n = os.cpus().length; for (let i = 0; i < n; i++) cluster.fork(); cluster.on('exit', (w) => { console.log(`worker ${w.id} 退出,重启`); cluster.fork(); }); } else { require('./app'); // 每个 worker 都监听同一端口 } ``` 主进程 `fork` 出 N 个 worker,所有 worker 监听同一个端口,由操作系统层面做负载分发。 ## 三、四个高频坑 > **坑 1:误以为 worker 之间共享内存** > 每个 worker 是独立进程,变量互不连通。登录态、缓存必须放外部存储(Redis、数据库),否则用户请求被分配到不同 worker,session 就读不到。 > **坑 2:惊群效应拖慢连接** > 早期版本大量 worker 同时被唤醒抢一个连接。现代 Node 已缓解,但仍建议用反向代理(Nginx)做前置分发,让 worker 专注于业务。 > **坑 3:崩溃只重启不报警** > `exit` 事件里 `fork` 重启是底线,但应同时上报监控。否则 worker 在死循环崩溃-重启之间打转,磁盘和 CPU 被悄悄吃光。 > **坑 4:定时任务被重复执行** > 每个 worker 都会跑一遍 `setInterval`,导致任务被执行 N 次。定时任务应只放在主进程,或引入分布式锁。 ## 四、进程管理建议 生产环境直接用 PM2 这类进程管理器,自带 cluster 模式、零停机重启和日志归集,比手写稳定得多。手写 cluster 适合理解原理和轻量场景。

1

0

文章点评
Copyright © from 2021 by namoer.com
458815@qq.com QQ:458815
蜀ICP备2022020274号-2