症状
worker 线程因 ERR_WORKER_OUT_OF_MEMORY 而退出,退出码为 1,但父进程仍继续运行。对于大负载该失败可稳定复现,小负载则正常。
诊断
检查配置的上限与实际需求:
const worker = new Worker('./job.js', {
resourceLimits: { maxOldGenerationSizeMb: 128 },
});
worker.on('exit', (code) => console.error('worker exit', code));
在 worker 内部拍取堆快照并对比其保留大小,找出无界增长的对象。
修复
将上限调高到与任务匹配,或更好的做法是改为流式输入、增量处理:
for await (const chunk of stream) {
process(chunk); // do not retain chunk
}
在大任务之间重建 worker,避免堆状态累积。
验证
用相同负载重跑,确认 worker 正常完成并以 0 退出。再做一次堆跟踪,应看到受控的峰值而非持续爬升的基线。