溫馨提示×

如何在CentOS上監控Node.js應用性能

小樊
44
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:可視化日志數據,通過關鍵詞(如ERROR、Timeout)快速定位性能瓶頸。
      示例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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女