Node.js 在 Linux 上的并发能力提升指南
一 架构与进程模型
- 使用 Cluster 模式充分利用多核:主进程监听端口,按 CPU 核心数fork 工作进程;Linux 默认采用 round-robin 调度,能更均匀地分发连接。示例要点:
- 在 master 分支 fork os.cpus().length 个子进程,并监听 worker 退出事件自动重启。
- 在 worker 分支启动业务服务,监听同一端口(由内核复用)。
- 使用 进程管理工具 PM2:一键多进程与守护,生产常用命令为 pm2 start app.js -i max(按 CPU 核数启动)。
- 反向代理与负载均衡:前置 Nginx/HAProxy 做连接管理、SSL 终止、静态资源缓存与负载分发,减轻后端并发压力。
- 适用场景选型:
- Cluster:面向无状态 HTTP 服务的横向扩展,进程隔离、稳定性强。
- Worker Threads:面向 CPU 密集型任务(如加密、压缩、图像处理),避免阻塞事件循环。
二 线程与任务并行
- 优先将 CPU 密集型任务移入 Worker Threads 或线程池;I/O 密集型任务继续使用异步非阻塞即可。
- 采用线程池库 Piscina 管理线程生命周期与队列:
- 适用:同步计算、压缩、加密等;对“异步 I/O”任务提升有限(Node 已通过 libuv 并行化 I/O)。
- 关键配置:合理设置 minThreads / maxThreads 与 maxQueue,经验上可将 maxQueue ≈ maxThreads² 作为起点,再压测微调。
- 稳定性:通过 idleTimeout 减少线程抖动,必要时调整线程优先级避免抢占主事件循环资源。
三 Linux 系统与网络调优
- 提升资源上限与内核参数:
- 文件描述符:在 /etc/security/limits.conf 提高 nofile,运行时可用 ulimit -n 临时调整,避免 “Too many open files”。
- 网络与内核:适度调大 net.core.somaxconn(全连接队列)、开启 TCP keepalive、优化缓冲区,降低连接建立/中断开销与队列溢出风险。
- 传输层优化:
- 启用 HTTP/2(多路复用、头部压缩)降低连接开销;开启 Keep-Alive 复用连接。
- 静态资源使用 CDN 与缓存策略,减少源站并发与带宽压力。
四 数据层与缓存策略
- 数据库优化:为高频查询建立 索引、优化慢查询、使用 连接池 控制并发连接数,避免连接风暴。
- 引入缓存层:使用 Redis/Memcached 缓存热点数据与计算结果,显著降低数据库读压力与 P95/P99 延迟。
- 队列削峰:对耗时任务(如报表、图片/视频处理)使用 Redis 任务队列与异步 worker 处理,保护在线接口稳定性。
五 监控 压测与上线实践
- 运行时监控与剖析:
- 指标与可视化:接入 Prometheus + Grafana 监控 CPU、内存、事件循环延迟、请求延迟/吞吐 等;使用 New Relic 等 APM 追踪事务与错误。
- 日志:采用 Winston/Pino 输出结构化日志,按级别与模块分流,避免同步日志阻塞事件循环。
- 健康检查:暴露 /health 端点供 Nginx/负载均衡器 探活与自动摘除异常实例。
- 压测与容量评估:使用 autocannon 等工具进行并发压测,结合指标调参(进程数、线程池大小、队列长度、连接池与缓存策略),验证瓶颈与收益。
- 上线与守护:使用 PM2 或 systemd 做守护、自动重启与日志轮转,保障高可用与可运维性。