CentOS 上提升 Node.js 性能的系统化做法
一 运行时与代码层面
- 使用最新 Node.js LTS 版本,及时获得 V8 与内置模块的优化与修复。
- 坚持 异步/非阻塞 编程,避免 同步 I/O;大数据场景优先使用 Streams 进行流式处理,降低内存峰值。
- 优化数据访问:为高频查询建立 索引、使用 连接池、合并/减少外部 HTTP 调用。
- 合理使用缓存:对热点数据采用 内存缓存(如 node-cache) 或 Redis/Memcached,并设置合理 TTL。
- 内存与 GC:通过环境变量设置 NODE_OPTIONS=“–max_old_space_size=4096” 提升堆上限(默认约 1.5GB),并避免全局泄漏与闭包滥用。
- 诊断与压测:使用 node --inspect / --prof 定位瓶颈,配合 Autocannon / wrk / Artillery 进行基准测试与回归。
二 进程与并发模型
- 利用 多核 CPU:使用 Cluster 模块或 PM2 集群模式(如 cluster.fork(os.cpus().length) 或 pm2 start app.js -i max),分摊负载并提升吞吐。
- 进程守护与自愈:用 PM2 的 –max-memory-restart 4G 防止内存失控,结合日志与监控实现自动重启与滚动升级。
- 无状态化设计:将 Session、上传文件等外置到 Redis 或对象存储,便于水平扩展与弹性伸缩。
三 反向代理与网络栈优化
- 前置 Nginx:承担 静态资源、SSL/TLS 与 HTTP/2 终止,启用 gzip/Brotli、长连接与合适的缓存策略,显著降低 Node.js 负载。
- 连接与内核参数:提升系统 文件描述符 与网络队列能力,示例(/etc/security/limits.conf 与 /etc/sysctl.conf):
- 文件描述符:* soft/hard nofile 65535
- 网络:net.core.somaxconn 65535;net.ipv4.tcp_max_syn_backlog 65535;net.ipv4.ip_local_port_range 1024 65535;net.ipv4.tcp_tw_reuse 1;net.ipv4.tcp_fin_timeout 30
- 缓冲区:net.core.rmem_max / wmem_max 16777216;net.ipv4.tcp_rmem 4096 87380 16777216;net.ipv4.tcp_wmem 4096 65536 16777216
- 可选:net.ipv4.tcp_fastopen 3
调整后执行 sysctl -p 生效。
- 传输层优化:启用 HTTP/2 多路复用 与头部压缩,减少握手与队头阻塞。
四 监控 诊断与容量规划
- 实时监控:接入 Prometheus + Grafana 采集 HTTP 延迟/吞吐/QPS/错误率 与系统指标;日志采用 ELK 或结构化 JSON 便于检索。
- APM 与追踪:使用 New Relic / AppDynamics / Datadog 定位慢事务、外部依赖瓶颈与异常堆栈。
- 内存问题定位:在可疑路径生成 Heap Snapshot(如 heapdump),或使用 memwatch-next 侦测泄漏趋势,配合 –inspect / --prof 做 CPU/堆分析。
- 容量与弹性:基于压测结果设置 PM2 实例数与 自动扩缩容 阈值,结合 Nginx 健康检查与熔断策略保障稳定性。
五 一键落地清单
- 部署与版本:安装 NodeSource LTS 仓库并升级;确保 64 位 运行时。
- 进程与集群:用 PM2 启动集群(如 -i max),配置 –max-memory-restart 4G 与日志轮转。
- 反向代理:部署 Nginx,开启 HTTP/2、静态资源缓存与压缩,代理到本地 Node 端口。
- 系统调优:提升 ulimit -n 65535,写入 /etc/security/limits.conf;应用上述 sysctl 网络参数并 sysctl -p。
- 缓存与连接:启用 Redis 作为会话/热点缓存;数据库使用 连接池 与 索引 优化。
- 监控与压测:接入 Prometheus/Grafana 与 APM,使用 wrk/Autocannon 做基线压测并持续回归。