CentOS 上 Node.js 性能调优实战指南
一 基础环境与运行时
- 保持系统与依赖为较新稳定版本,优先使用 LTS 的 Node.js,可通过 NodeSource 或 NVM 安装与切换版本,便于获得性能修复与优化。
- 使用 PM2 进行进程守护与集群管理,结合多核 CPU 启动多个实例,提升吞吐与稳定性。
- 设置合理的 V8 内存上限(如:–max-old-space-size=8192 表示 8GB),避免无限制增长导致系统换页或 OOM。
- 示例(PM2 集群 + 内存上限):
- 启动命令:pm2 start app.js -i max --max-memory-restart 8G
- 配置环境变量:export NODE_OPTIONS=“–max-old-space-size=8192”
以上做法有助于获得更好的运行时性能与可运维性。
二 系统层面网络与内核
- 使用 Nginx 作为反向代理与静态资源服务器,启用 Gzip 压缩、HTTP/2 或 TLS 终止,并代理 WebSocket,显著降低 Node.js 在连接与加解密上的开销。
- 调整内核网络参数以提升高并发连接处理能力(/etc/sysctl.conf 或 sysctl -w 临时生效):
- net.core.somaxconn:增大监听队列(如 10000)
- net.ipv4.tcp_fin_timeout:缩短 TIME_WAIT 回收(如 15)
- net.ipv4.tcp_tw_reuse:允许复用 TIME_WAIT 连接(如 1)
- 注意:部分新内核已移除或默认禁用 tcp_tw_recycle,避免误用
- 建议:保持系统与安全组/防火墙策略一致,逐步调大参数并压测验证。
这些网络与内核优化能显著改善连接承载与吞吐表现。
三 应用架构与代码层优化
- 坚持 异步非阻塞 I/O:优先使用 async/await、Promise,避免 同步文件读写/计算 等阻塞事件循环的操作。
- 处理大文件与大数据流时使用 Streams,天然具备 背压(Backpressure) 控制,避免一次性加载导致内存暴涨。
- 对 CPU 密集型 任务使用 Worker Threads 或 子进程 分流,保持主线程对请求的快速响应。
- 数据库与后端调用侧:开启 连接池、为高频查询建立 索引、减少 N+1 查询、合理设置 超时与重试。
- 引入 缓存层级:本地 LRU 缓存热点数据,分布式 Redis/Memcached 缓存跨进程/跨实例共享数据。
- 避免常见内存问题:减少 全局变量、及时清理 定时器/事件监听、避免 闭包 意外持有大对象、必要时使用 对象池 复用昂贵对象。
这些实践能从架构与代码层面直接降低延迟、提升吞吐与稳定性。
四 内存与 GC 调优
- 持续观测内存指标:在代码中记录 process.memoryUsage()(rss/heapUsed/external 等),配合 Prometheus + Grafana 或 New Relic 建立告警与趋势分析。
- 生成与分析 堆快照(heapdump)、使用 Chrome DevTools 定位泄漏根因;定期审查依赖的内存开销。
- 容器/虚拟机场景显式设置容器内存上限,并与 Node 的 –max-old-space-size 匹配,避免超出 cgroup 限制被 OOM Killer 终止。
- 在内存紧张或对象生命周期较短的场景,可尝试 –optimize_for_size 降低内存占用(可能带来一定性能权衡)。
- 建议:建立“采集-分析-验证”的闭环,每次优化后通过压测确认效果与回归风险。
上述方法有助于提前发现内存异常、定位泄漏并稳定 GC 行为。
五 高并发与负载均衡实践
- 利用 Node.js Cluster 启动与 CPU 核数 相当的 工作进程,共享同一端口,充分利用多核能力。
- 前置 Nginx 做 负载均衡(如轮询、最少连接等策略),分发请求到多个 Node 实例;静态资源交由 Nginx 或 CDN 加速。
- 对长连接/实时场景(如 WebSocket)使用 Nginx 进行连接代理与升级管理,提升连接稳定性与横向扩展能力。
- 建议:保持应用 无状态,将 会话/状态 外置到 Redis 等共享存储,便于水平扩展与弹性伸缩。
通过集群、负载均衡与无状态化设计,可显著提升并发承载与故障恢复能力。