温馨提示×

CentOS Node.js 如何优化网络性能

小樊
35
2025-12-09 13:07:25
栏目: 编程语言

CentOS 上 Node.js 网络性能优化实操

一 系统层优化

  • 文件描述符与进程限制
    • 临时提升:执行 ulimit -n 65535;永久生效在 /etc/security/limits.conf 增加:
      * soft nofile 65535
      * hard nofile 65535
      
    • 系统级文件句柄上限:fs.file-max=1048576(写入 /etc/sysctl.conf)。这能避免高并发下的 “Too many open files”。
  • 内核网络参数(/etc/sysctl.conf 示例)
    # 连接队列与半连接
    net.core.somaxconn = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    
    # 本地端口与端口复用
    net.ipv4.ip_local_port_range = 1024 61999
    net.ipv4.tcp_tw_reuse = 1
    
    # 关闭 tcp_tw_recycle(在 NAT/负载均衡或多主机环境易出问题)
    # net.ipv4.tcp_tw_recycle = 0 或删除该行
    
    # 加速回收
    net.ipv4.tcp_fin_timeout = 30
    
    # 可选:启用 TCP Fast Open(需客户端也支持)
    # net.ipv4.tcp_fastopen = 3
    
    # 可选:启用 syncookies(抵御小规模 SYN Flood)
    # net.ipv4.tcp_syncookies = 1
    
    # 套接字/内核内存缓冲
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    
    执行 sysctl -p 使配置生效;按需开启可选参数。上述取值可显著提升并发连接与短连接处理能力。

二 Node.js 应用层优化

  • 多核与并发
    • 使用 cluster 模块按 CPU 核数 启动多进程,充分利用多核,提高吞吐与稳定性。
  • 协议与压缩
    • 启用 HTTP/2(多路复用、头部压缩)或 HTTPS;在 Express 中使用 compression 中间件启用 Gzip,降低传输体积与时延。
  • 数据与事件循环
    • 处理大文件/大数据流时使用 Streams,减少内存占用与阻塞;避免 同步 I/O 与长计算阻塞事件循环,将耗时任务拆分或放入线程池/队列。
  • 缓存与后端交互
    • 合理使用 内存缓存(如 node-cache、lru-cache);数据库查询加索引、使用连接池,减少 N+1 查询与频繁建连开销。

三 架构与反向代理

  • 使用 Nginx 作为反向代理与静态资源服务器,配置示例:
    server {
      listen 80;
      server_name example.com;
    
      location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
      }
    
      location /static/ {
        root /path/to/static/files;
      }
    }
    
    • 由 Nginx 处理 静态资源负载均衡TLS/HTTP/2 终止,Node.js 专注业务逻辑,整体吞吐与安全性更佳。

四 监控与压测

  • 请求耗时定位
    • 使用 curl -w 输出 DNS、TCP、首字节与总耗时,快速定位瓶颈阶段:
      curl -w "
      DNS解析  : %{time_namelookup}s
      TCP连接 : %{time_connect}s
      服务器处理: %{time_starttransfer}s
      总耗时  : %{time_total}s\n" -o /dev/null -s http://example.com
      
  • 压力测试
    • 使用 ab 进行并发压测(示例:ab -n 1000 -c 100 http://example.com/),关注 Connect TimeProcessing Time 等指标。
  • 运行时与系统监控
    • 观察文件描述符使用:cat /proc/sys/fs/file-nr;结合应用与系统监控(如 Prometheus + Grafana)持续观测吞吐、错误率与延迟,指导参数回放与迭代。

五 常见瓶颈与排查

  • 事件循环阻塞与 CPU 密集型 任务:将计算拆分、使用异步或线程池,必要时引入消息队列与缓存。
  • 内存泄漏/频繁 GC:定位泄漏点、优化数据结构与引用,必要时调整 –max-old-space-size 并配合堆分析。
  • I/O 阻塞:数据库/外部 API 加索引与连接池,避免频繁建连与慢查询,使用流式处理大对象。
  • 系统资源限制:文件描述符、内核网络队列、端口范围等配置不足会限制并发;按上文提升并监控使用量。
  • 网络延迟与带宽:结合 curl 阶段耗时与带宽监控(如 nload、iftop)定位是链路、带宽还是服务端处理问题。

0