照着文档写了多进程启动逻辑,进程列表里却只有一个工作进程在跑,单核长期满负荷,其余核心基本闲置,并发一高就排队。日志里能对上时间点,这种反而好排。

派生出来的工作进程又去监听同一个端口导致异常被吞掉,或者派生次数写成了常量而不是核心数量,实际只起了一个子进程。这一点先确认清楚,后面就不用反复试。

const cluster = require('node:cluster');
const n = require('node:os').cpus().length;
for (let i = 0; i < n; i++) cluster.fork();

「cluster 多核利用」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。

处理上按这个顺序:用系统核心数量来决定到底需要派生几个进程;只在工作进程里监听,主进程不要再去抢端口;监听退出事件,挂掉一个就立刻补上一个新的。

结果对不对很好判断,进程数和核心数对得上,压测时多个核心都有负载,队列不再堆积。

作者 9823189