温馨提示×

如何在CentOS上监控Node.js应用性能

小樊
50
2025-10-15 05:13:16
栏目: 编程语言

在CentOS上监控Node.js应用性能的方法可分为 进程管理工具、系统级工具、第三方APM工具、日志管理、内置模块及自定义方案 六大类,以下是具体实现步骤:

1. 使用PM2进程管理器(推荐)

PM2是Node.js生态中最流行的进程管理工具,提供性能监控、日志管理、自动重启等功能,适合生产环境使用。

  • 安装PM2:通过npm全局安装(需先确保Node.js环境已配置):
    sudo npm install pm2 -g
    
  • 启动应用:通过PM2启动Node.js应用并命名(便于后续管理):
    pm2 start app.js --name "my-node-app"
    
  • 监控资源使用:实时查看应用的CPU、内存、事件循环延迟等指标:
    pm2 monit
    
  • 查看应用状态:列出所有由PM2管理的应用及其运行状态:
    pm2 list
    
  • 日志管理:查看应用实时日志(支持多应用过滤):
    pm2 logs my-node-app
    
  • 设置开机自启:保存当前PM2进程列表并配置系统开机自动启动:
    pm2 save && pm2 startup
    

2. 系统级监控工具(CentOS原生)

通过CentOS自带的命令行工具,可快速查看系统资源占用及Node.js进程状态:

  • top/htop:动态显示系统中运行的进程及其CPU、内存使用情况(htop需安装,更直观):
    sudo yum install htop -y  # 安装htop
    top  # 或 htop
    
  • vmstat:监控系统整体资源使用(进程、内存、IO、CPU等),每3秒刷新一次:
    vmstat 3
    
  • iostat:查看磁盘IO使用情况(需安装sysstat包):
    sudo yum install sysstat -y
    iostat -x 1  # 查看磁盘详细IO指标
    
  • free:查看系统内存使用情况(包括缓存、缓冲区):
    free -m  # 以MB为单位显示
    

3. 第三方APM工具(全面性能分析)

APM(应用性能管理)工具可提供端到端性能追踪、错误监控、慢查询分析等功能,适合复杂应用:

  • Prometheus + Grafana(开源组合)
    • Prometheus:收集Node.js应用的指标数据(需安装Node Exporter或使用prom-client库暴露指标);
    • Grafana:可视化Prometheus中的数据,创建仪表盘(如CPU、内存、请求延迟等)。
      部署步骤可参考之前关于Prometheus和Grafana的配置教程。
  • New Relic/Datadog(商业工具)
    • New Relic:通过安装newrelic Node.js模块(npm install newrelic --save),配置newrelic.js文件(填入许可证密钥),即可实时监控应用性能、错误日志及分布式追踪。
    • Datadog:通过Agent收集系统及应用指标,支持Node.js应用监控(需安装Datadog Agent并配置datadog.yaml)。

4. 日志管理(定位问题根源)

日志是排查性能问题的关键,可通过以下工具收集、分析Node.js日志:

  • ELK Stack(Elasticsearch + Logstash + Kibana)
    • Logstash:配置收集Node.js日志(如/var/log/nodejs/app.log),解析后发送到Elasticsearch;
    • Kibana:可视化日志数据,通过关键词(如ERRORTimeout)快速定位性能瓶颈。
      示例Logstash配置(/etc/logstash/conf.d/nodejs.conf):
    input {
      file {
        path => "/path/to/your/nodejs/logs/*.log"
        start_position => "beginning"
      }
    }
    output {
      elasticsearch {
        hosts => ["localhost:9200"]
        index => "nodejs-logs-%{+YYYY.MM.dd}"
      }
    }
    
  • 日志库增强:使用winstonmorgan记录结构化日志(如请求时间、状态码、响应时间),便于后续分析:
    const winston = require('winston');
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new winston.transports.File({ filename: 'error.log', level: 'error' }),
        new winston.transports.File({ filename: 'combined.log' })
      ]
    });
    // 记录请求日志(配合Express中间件)
    app.use((req, res, next) => {
      const start = Date.now();
      res.on('finish', () => {
        logger.info({
          method: req.method,
          url: req.url,
          status: res.statusCode,
          responseTime: Date.now() - start
        });
      });
      next();
    });
    

5. Node.js内置模块(基础监控)

通过Node.js原生模块可快速获取应用的基本性能指标:

  • process模块:获取CPU使用率、内存占用、事件循环延迟等信息:
    setInterval(() => {
      const cpuUsage = process.cpuUsage(); // 返回用户态/内核态CPU时间(微秒)
      const memoryUsage = process.memoryUsage(); // 返回堆内存、RSS等指标
      console.log(`CPU Usage: ${cpuUsage.user / 1000000}秒`);
      console.log(`Memory Usage: ${Math.round(memoryUsage.heapUsed / 1024 / 1024 * 100) / 100}MB`);
    }, 5000); // 每5秒打印一次
    
  • os模块:获取系统级资源信息(如总内存、CPU核心数、系统负载):
    const os = require('os');
    const totalMem = os.totalmem(); // 总内存(字节)
    const freeMem = os.freemem(); // 空闲内存(字节)
    const loadAvg = os.loadavg(); // 系统1/5/15分钟平均负载
    console.log(`Total Memory: ${(totalMem / 1024 / 1024).toFixed(2)}MB`);
    console.log(`Free Memory: ${(freeMem / 1024 / 1024).toFixed(2)}MB`);
    console.log(`System Load Avg: ${loadAvg.join(', ')}`);
    

6. 自定义监控脚本(灵活定制)

若需特定指标(如数据库查询时间、第三方API响应时间),可编写自定义脚本定期收集并上报数据:

  • 示例:监控HTTP请求响应时间
    const http = require('http');
    const start = Date.now();
    http.get('http://example.com', (res) => {
      const duration = Date.now() - start;
      console.log(`Request to example.com took ${duration}ms`);
      // 可将数据发送到Prometheus、InfluxDB等存储
    });
    
  • 上报数据到Prometheus:使用prom-client库暴露自定义指标(如HTTP请求计数、响应时间):
    const promClient = require('prom-client');
    const httpRequestDurationMicroseconds = new promClient.Histogram({
      name: 'http_request_duration_ms',
      help: 'Duration of HTTP requests in ms',
      buckets: [10, 50, 100, 500, 1000] // 定义桶范围
    });
    
    app.use((req, res, next) => {
      const start = Date.now();
      res.on('finish', () => {
        httpRequestDurationMicroseconds.observe({
          method: req.method,
          path: req.path,
          status: res.statusCode
        }, Date.now() - start);
      });
      next();
    });
    
    // 启动Prometheus metrics endpoint
    app.get('/metrics', async (req, res) => {
      res.set('Content-Type', promClient.register.contentType);
      res.end(await promClient.register.metrics());
    });
    

以上方法可根据应用规模、监控深度、预算选择组合使用(如小型应用用PM2+系统命令,大型应用用Prometheus+Grafana+APM工具),实现对Node.js应用性能的全面监控。

0