Node.js 在 CentOS 上的性能提升实践
一 运行时与进程管理
- 使用Node.js LTS或最新稳定版,优先通过NodeSource仓库安装,获得更好的性能修复与 V8 优化。
- 合理设置 V8 内存上限:默认 V8 堆上限约为1.5GB,内存吃紧时可设置环境变量,例如:
export NODE_OPTIONS="--max_old_space_size=4096"(单位 MB)。
- 充分利用多核:使用内置 Cluster或PM2集群模式,按 CPU 核数启动多个工作进程,显著提升并发能力。
- 进程守护与自愈:用PM2启动应用,并配置内存阈值自动重启,例如:
pm2 start app.js --max-memory-restart 4G,避免 OOM 拖垮服务。
- 启用HTTP/2(应用或经由 Nginx 终止),获得多路复用、头部压缩等网络性能收益。
二 系统与网络调优
- 提升文件描述符上限,支撑更高并发连接:
- 查看:
ulimit -n
- 临时:
ulimit -n 65535
- 永久:在
/etc/security/limits.conf添加:* soft nofile 65535 与 * hard nofile 65535
- 优化内核网络参数(
/etc/sysctl.conf):
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
- 可选:启用TCP Fast Open:
net.ipv4.tcp_fastopen = 3
- 应用后执行:
sysctl -p 使配置生效。
- 使用Nginx作为反向代理与静态资源缓存、负载均衡(如轮询、最少连接),并可代理WebSocket;在边缘启用SSL/TLS 与 HTTP/2,减少 Node.js 端计算压力并提升连接效率。
三 代码与数据层优化
- 坚持异步/非阻塞 I/O,避免同步 API 阻塞事件循环;对 CPU 密集任务考虑拆分或采用 Worker Threads。
- 处理大文件或大数据流时使用Streams,降低内存占用并提升吞吐。
- 优化数据库访问:为高频查询字段建立索引,使用连接池,减少频繁建立/关闭连接的开销。
- 合理使用缓存:对热点数据使用内存缓存(如 node-cache)或Redis,对静态资源使用CDN与 Nginx 缓存,降低后端压力。
- 减少不必要的外部服务调用与链路依赖,设置超时与熔断策略,避免长尾请求拖慢整体响应。
四 监控 诊断与内存问题处理
- 监控与观测:
- 使用PM2内置监控:
pm2 list、pm2 monit 观察 CPU、内存、重启次数。
- 远程调试与分析:
node --inspect 结合 Chrome DevTools Performance 定位慢函数与调用栈。
- 日志体系:
- 采用结构化日志(如 JSON)、合理日志级别与异步写入,并使用日志轮转避免磁盘占满。
- 集中化分析可用 ELK Stack(Logstash + Elasticsearch + Kibana)。
- 内存泄漏与 OOM 定位:
- 生成堆快照(如 heapdump)对比分析对象增长;使用内存监控工具(如 memwatch-next)辅助发现泄漏。
- 若物理内存不足,可临时增加Swap(示例:
fallocate -l 4G /swapfile → mkswap → swapon → 写入 /etc/fstab),但应优先优化应用与扩容内存。
五 一键可用的最小实践清单
- 安装与运行:使用NodeSource安装LTS版本;用PM2以集群模式启动:
pm2 start app.js -i max --max-memory-restart 4G。
- 反向代理:部署Nginx,开启HTTP/2,对外提供静态资源与路由转发,Node.js 仅处理动态请求。
- 系统调优:设置文件描述符 65535;在
/etc/sysctl.conf中配置somaxconn、tcp_tw_reuse、tcp_fin_timeout等关键参数并执行sysctl -p。
- 缓存策略:热点数据上Redis,静态资源走CDN + Nginx 缓存。
- 观测与排障:接入PM2 monit与日志轮转;出现内存异常时用heapdump定位泄漏点。