首页 文章 精选 留言 我的

精选列表

搜索[node.js],共4383篇文章
优秀的个人博客,低调大师

Node.js 中使用 worker_threads 处理 CPU 密集型任务时的内存泄漏排查

线上有个图片处理服务最近频繁 OOM,重启后跑十几个小时内存就涨到 1.5G 左右,容器限制是 2G,再涨就直接被 kill。服务本身逻辑不复杂:接收上传的图片,交给 worker_threads 做缩略图生成和格式转换,主线程只做 I/O 和队列调度。最初怀疑是图片缓冲区没释放,排查后发现主线程的 Buffer 都已经正常回收,堆快照里也没有明显的大对象。真正的问题藏在 worker 的生命周期管理上——每次任务都 new 一个 Worker,用完调用 terminate(),但 terminate 是异步的,大量并发下 worker 还没真正退出,新的 worker 又在创建,加上 worker 内部加载的 sharp 原生模块会占用外部内存,堆外内存的增长在 Node 的 heap snapshot 里根本看不到。这篇文章记录这次排查的过程,涉及 worker_threads 的复用策略、terminate 与 exit 的时序问题,以及如何用 process.memoryUsage 和 --inspect 定位堆外内存。

优秀的个人博客,低调大师

Node.js 中使用 worker_threads 处理 CPU 密集型任务时,为什么性能反而下降?

最近在优化一个图片处理服务时,把原来在主线程里跑的 Sharp 压缩逻辑挪到了 `worker_threads` 里,想着能避免阻塞事件循环。结果压测跑下来,QPS 不升反降,CPU 占用率倒是上去了,内存也涨了一截。这个现象其实挺常见:worker 线程本身有启动开销,线程间通信要序列化数据,如果任务粒度太小或者传输的数据太大,并行带来的收益会被这些成本直接吃掉。更隐蔽的是,Node 的 worker 并不共享内存(除非用 SharedArrayBuffer),每次 postMessage 都是一次结构化克隆,大 Buffer 会被完整复制。这篇文章从实际代码出发,聊聊 worker_threads 在什么情况下会拖慢性能,以及怎么判断该不该用它。 先还原一下出问题的代码结构。服务收到图片后,把 Buffer 通过 postMessage 发给 worker,worker 里调用 sharp 压缩,再把结果传回来: ```js // main.js const { Worker } = require('worker_threads'); function compressInWorker(buffer) { return new Promise((resolve, reject) => { const worker = new Worker('./compress-worker.js'); worker.postMessage(buffer); worker.once('message', resolve); worker.once('error', reject); }); } ``` ```js // compress-worker.js const { parentPort } = require('worker_threads'); const sharp = require('sharp'); parentPort.once('message', async (buffer) => { const out = await sharp(buffer).jpeg({ quality: 70 }).toBuffer(); parentPort.postMessage(out); }); ``` 这段代码每个请求都 new 一个 Worker。Worker 的创建成本不低,要初始化一个独立的 V8 isolate 和事件循环,实测单个 Worker 启动在几十毫秒量级。高并发下大量短命 Worker 的创建销毁成了主要开销,压缩本身反而成了次要的。 另一个问题是 Buffer 的传输。默认的 postMessage 使用结构化克隆算法,ArrayBuffer 和 Buffer 的内容会被复制一份。一张几 MB 的图,进来复制一次、出去再复制一次,内存带宽和 GC 压力都上来了。把 worker 改成常驻、用 `transferList` 转移 ArrayBuffer 的所有权,能省掉复制: ```js // 转移而不是复制 const ab = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); worker.postMessage(ab, [ab]); ``` 注意转移之后原 ArrayBuffer 会被 detach,主线程不能再访问,适合这种“发出去就不管”的场景。但 Buffer 底层可能来自共享的 Buffer pool,直接拿 `buffer.buffer` 去转移可能把整个 pool 都转走,所以上面先 slice 出一段独立的。 常驻 worker 配合任务队列是更合理的形态: ```js class WorkerPool { constructor(size, workerPath) { this.idle = []; this.queue = []; for (let i = 0; i { const { resolve } = w._current; w._current = null; resolve(msg); this.idle.push(w); this.drain(); }); this.idle.push(w); } } run(payload, transfer) { return new Promise((resolve, reject) => { this.queue.push({ payload, transfer, resolve, reject }); this.drain(); }); } drain() { while (this.idle.length && this.queue.length) { const w = this.idle.pop(); const task = this.queue.shift(); w._current = task; w.postMessage(task.payload, task.transfer); } } } ``` 但这仍然解决不了根本问题:sharp 底层用的是 libvips,本身就会开线程做并行,再套一层 worker_threads 属于重复并行,线程数一多上下文切换反而变多。实际测试里把 worker 数量设成 CPU 核数一半左右,比拉满更稳。 判断要不要用 worker_threads,可以先看任务是不是真的阻塞事件循环。纯 JS 的加密、压缩、大 JSON 解析这类计算密集且不涉及原生线程池的操作,挪到 worker 收益明显;而像 sharp、bcrypt 这种底层已经有线程池的库,主线程调用其实不会长时间卡住事件循环,硬套 worker 往往得不偿失。可以用 `perf_hooks` 的 `monitorEventLoopDelay` 先确认延迟分布: ```js const { monitorEventLoopDelay } = require('perf_hooks'); const h = monitorEventLoopDelay({ resolution: 10 }); h.enable(); setInterval(() => { console.log('p99 ms:', h.percentile(99) / 1e6); h.reset(); }, 5000); ``` 如果 p99 一直在几十毫秒以上,说明事件循环确实被拖住了,再考虑 worker。另外 worker 之间共享状态要靠 SharedArrayBuffer 或者消息传递,SharedArrayBuffer 需要正确的内存序配合 Atomics,复杂度不低,能用消息队列解决就别上共享内存。 还有个容易忽略的点是错误处理。worker 内部抛出的异常不会自动冒泡到主线程,必须监听 `error` 和 `exit`,否则 Promise 永远挂着,连接池很快被占满: ```js worker.on('error', (err) => { const task = worker._current; worker._current = null; if (task) task.reject(err); // 这个 worker 已经不可用,从池里移除并补一个新的 }); worker.on('exit', (code) => { if (code !== 0) console.error('worker exited with', code); }); ``` worker 崩溃后不能放回空闲队列,得销毁重建,不然下一次任务会 postMessage 到一个已经退出的线程上,触发 ERR_WORKER_NOT_RUNNING。 回到开头那个服务,最终把常驻池大小定成 2,配合 transferList 转移输入 Buffer,输出也转移回主线程,QPS 才回到主线程直接调用的水平并略有提升。worker_threads 不是万能加速器,它解决的是事件循环阻塞,不是计算速度本身。任务足够重、数据传递成本足够低、底层库没有自己的线程池,这三个条件同时满足时,它才值得引入。 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4801.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4802.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4803.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4804.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4805.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4806.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4807.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4808.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4809.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4810.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4811.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4812.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4813.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4814.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4815.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4816.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4817.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4818.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4819.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4820.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4821.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4822.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4823.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4824.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4825.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4826.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4827.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4828.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4829.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4830.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4831.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4832.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4833.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4834.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4835.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4836.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4837.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4838.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4839.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4840.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4841.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4842.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4843.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4844.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4845.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4846.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4847.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4848.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4849.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4850.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4851.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4852.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4853.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4854.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4855.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4856.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4857.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4858.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4859.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4860.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4861.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4862.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4863.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4864.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4865.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4866.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4867.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4868.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4869.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4870.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4871.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4872.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4873.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4874.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4875.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4876.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4877.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4878.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4879.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4880.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4881.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4882.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4883.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4884.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4885.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4886.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4887.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4888.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4889.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4890.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4891.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4892.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4893.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4894.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4895.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4896.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4897.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4898.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4899.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4900.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4901.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4902.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4903.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4904.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4905.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4906.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4907.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4908.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4909.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4910.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4911.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4912.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4913.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4914.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4915.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4916.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4917.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4918.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4919.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4920.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4921.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4922.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4923.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4924.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4925.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4926.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4927.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4928.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4929.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4930.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4931.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4932.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4933.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4934.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4935.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4936.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4937.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4938.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4939.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4940.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4941.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4942.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4943.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4944.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4945.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4946.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4947.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4948.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4949.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4950.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4951.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4952.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4953.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4954.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4955.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4956.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4957.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4958.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4959.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4960.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4961.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4962.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4963.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4964.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4965.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4966.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4967.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4968.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4969.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4970.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4971.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4972.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4973.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4974.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4975.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4976.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4977.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4978.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4979.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4980.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4981.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4982.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4983.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4984.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4985.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4986.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4987.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4988.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4989.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4990.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4991.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4992.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4993.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4994.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4995.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4996.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4997.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4998.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/4999.html 推荐查看天气:http://www.tianqi98.com/jizhuanwan/5000.html

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册