在 1024 并发压测下,未限制并发数的 Node.js 应用错误率高达 6.8%,而将并发控制在 512 时错误率降至 0.2%,平均响应时间从 476ms 优化到 128ms。
原因分析
Node.js 基于事件循环 (Event Loop) 调度任务,将异步操作交由 libuv 处理,但单线程特性决定了 CPU 密集型操作会阻塞事件循环。当并发请求达到 1024 级别时,事件循环延迟、内存泄漏与冷启动问题会显著暴露,默认配置下性能在 800 并发后急剧下降。Promise 在创建后会立即执行,如果传入 Promise.all 中的多个 Promise 实例都包含 HTTP 请求,会在瞬间发出 n 个请求,导致套接字耗尽和服务器资源过载。并发数超过 10 就得加限制,真实场景中并发 20+ 请求常导致 PHP-FPM 等后端服务崩溃。
解决方案:使用 p-limit 库控制并发
推荐使用 p-limit 库实现并发池 (Concurrency Pool) 控制。示例代码:import pLimit from'p-limit'; const limit = pLimit(10); async function optimizedFetch(){ const promises = urls.map(url => limit(() => fetch(url).then(res => res.json()))); return Promise.all(promises); } 最大并发数建议设置为 10,该方案于 2025 年 7 月 25 日被验证为高并发场景下的最佳实践。相比顺序执行的 Async/Await 模式,Promise.all 通过并行触发机制可提升 300%-500% 的性能,但必须配合并发限制使用。
解决方案:自定义 asyncPool 函数
如果不想依赖第三方库,可实现自定义并发控制函数。核心代码:async function asyncPool(poolLimit, array, iteratorFn){ const ret = []; const executing = []; for(const item of array){ const p = Promise.resolve(iteratorFn(item)); ret.push(p); if(poolLimit <= array.length){ const e = p.then(() => executing.splice(executing.indexOf(e), 1)); executing.push(e); if(executing.length >= poolLimit){ await Promise.race(executing); } } } return Promise.all(ret); } 该实现于 2021 年 8 月 26 日发布,使用原生 Promise 实现,tiny-async-pool 库也采用类似方案。维护 queue 队列存储并发任务,activeCount 记录正在执行的并发数,当某个 Promise 状态变更后立即从 executing 列表中删除并补充新任务。
解决方案:HTTP 请求层优化
在 Request-Promise 中启用连接池复用减少握手开销,配置 pool: {maxSockets: 10} 根据服务器负载调整池大小。合理设置超时防止资源阻塞:timeout: 5000(5 秒超时),超时请求会自动触发 abort() 释放资源。启用 gzip 压缩减小传输体积,配置 gzip: true 可平均减少 60-80% 的传输大小。该优化方案于 2026 年 2 月 13 日验证有效。
注意事项
避免在循环中创建冗余 Promise,错误的异步控制会导致内存泄漏和响应延迟。使用 worker_threads 模块分流计算密集型任务,避免阻塞事件循环,函数实例初始化耗时可能超过 1.5 秒需启用常驻规避冷启动。限制单函数内存至 1024MB 以平衡资源与调度效率,使用--max-old-space-size 调整堆内存上限。通过 setInterval 监控内存使用情况:process.memoryUsage() 查看 rss、heapTotal、heapUsed,间隔 5000ms 检测一次。避免全局变量滥用,使用流 (Stream) 处理大文件减少内存峰值。
参考来源
来源:CSDN 博客 - JavaScript Node.js 1024 并发优化全记录 (云函数极限压测大揭秘),2025 年 10 月 20 日
来源:CSDN 博客 - Node.js 性能调优:实现高并发下的优化策略,2025 年 7 月 25 日
来源:CSDN 博客 - Request-Promise 性能优化:提升 Node.js HTTP 请求效率的 7 个技巧,2026 年 2 月 13 日
来源:知乎/技术社区 - Promise 并发控制如何解决,2021 年 8 月 26 日
原文链接:https://www.zjcp.cc/ask/9655.html
