温馨提示×

Debian系统Node.js资源如何监控

小樊
61
2025-09-29 17:06:53
栏目: 编程语言

Debian系统下监控Node.js资源的常用方法

1. 使用PM2进行进程管理与实时监控

PM2是Node.js生态中最流行的进程管理工具之一,不仅能保持应用持续运行,还能提供实时资源监控功能。

  • 安装PM2:通过npm全局安装,命令为sudo npm install -g pm2
  • 启动应用并监控:使用pm2 start app.js --name "my-node-app"启动应用,--watch参数可自动重启修改后的文件;pm2 monit命令会打开实时监控面板,显示CPU、内存使用率、进程状态及日志输出;pm2 list可查看所有进程的基本信息(如CPU、内存占比)。
  • 日志与历史记录pm2 logs查看实时日志,pm2 save保存当前进程列表,pm2 startup设置开机自启。

2. 利用Node.js内置模块监控资源

Node.js原生提供的processos模块可直接获取内存、CPU等资源信息,无需额外依赖。

  • 内存监控:通过process.memoryUsage()获取内存使用详情,返回对象包含:
    • rss(Resident Set Size):进程占用的物理内存总量(包括堆、栈、代码段等);
    • heapTotal/heapUsed:V8堆内存的总大小和已使用量;
    • external:C++对象占用的内存(如Buffer、Native模块)。
      示例代码:
    const memory = process.memoryUsage();
    console.log(`RSS: ${(memory.rss / 1024 / 1024).toFixed(2)}MB`);
    console.log(`Heap Used: ${(memory.heapUsed / 1024 / 1024).toFixed(2)}MB`);
    
  • CPU监控
    • process.cpuUsage():返回用户态(user)和系统态(system)的CPU时间(微秒),可通过两次调用的差值计算使用率;
    • process.hrtime():高精度时间计算(纳秒),用于计算代码块的执行时间。
      示例代码(计算1秒内的CPU使用率):
    const startUsage = process.cpuUsage();
    const startHr = process.hrtime();
    // 模拟CPU密集型任务
    for (let i = 0; i < 1e7; i++) {}
    const endUsage = process.cpuUsage(startUsage);
    const endHr = process.hrtime(startHr);
    const cpuTime = (endUsage.user + endUsage.system) / 1e6; // 微秒转毫秒
    const elapsedTime = (endHr[0] * 1e9 + endHr[1]) / 1e9; // 纳秒转秒
    console.log(`CPU Usage: ${(cpuTime / elapsedTime * 100).toFixed(2)}%`);
    
  • 系统负载os.loadavg()返回1、5、15分钟的系统平均负载(CPU任务队列长度),os.cpus()返回每个CPU核心的使用情况(用户态、内核态、空闲时间等)。

3. 第三方监控工具(Prometheus+Grafana)

对于生产环境,推荐使用**Prometheus(数据采集)+ Grafana(可视化)**组合,实现全面的资源监控与告警。

  • Prometheus配置
    1. 安装Prometheus:wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus_2.34.0.linux-amd64.deb && sudo dpkg -i prometheus_2.34.0.linux-amd64.deb
    2. 编辑配置文件/etc/prometheus/prometheus.yml,添加Node.js抓取任务:
      scrape_configs:
        - job_name: 'node'
          static_configs:
            - targets: ['localhost:9100'] # 需安装node_exporter
      
    3. 重启Prometheus:sudo systemctl restart prometheus
  • Node.js Exporter:使用node_exporter(Prometheus的Node.js客户端)暴露应用指标,命令为wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz && tar xvfz node_exporter-*.tar.gz && cd node_exporter-* && ./node_exporter &(默认监听9100端口)。
  • Grafana可视化
    1. 安装Grafana:wget https://dl.grafana.com/oss/release/grafana-8.2.0.linux-amd64.tar.gz && tar -zxvf grafana-8.2.0.linux-amd64.tar.gz && sudo mv grafana-8.2.0 /opt/grafana
    2. 启动Grafana:sudo /opt/grafana/bin/grafana-server
    3. 访问http://<服务器IP>:3000(默认账号admin/admin),添加Prometheus为数据源,导入Node.js监控模板(如ID:1860),即可查看CPU、内存、请求延迟等可视化图表。

4. 系统自带命令行工具

Debian系统的tophtopps等命令可快速查看Node.js进程的资源占用情况。

  • top命令:运行top后,按Shift+P按CPU排序,Shift+M按内存排序,找到Node.js进程(通常为node),查看%CPU(CPU使用率)、%MEM(内存使用率)、RES(常驻内存)等指标。
  • htop命令:更友好的交互式工具,需安装(sudo apt install htop),支持颜色高亮、鼠标操作,直接显示进程的CPU、内存、线程等信息。
  • ps命令:精准查看特定进程的资源使用,例如ps -p $(pgrep -f "app.js") -o %cpu,%mem,rss,vsz,cmd%cpu:CPU使用率;%mem:内存使用率;rss:常驻内存;vsz:虚拟内存;cmd:命令行)。

5. 日志记录资源使用情况

通过代码定期记录资源使用情况,便于后续分析和排查问题。

  • 内存日志:使用setInterval定时输出内存信息,例如:
    setInterval(() => {
      const memory = process.memoryUsage();
      console.log(`[${new Date().toISOString()}] Memory: RSS=${memory.rss / 1024 / 1024}MB, HeapUsed=${memory.heapUsed / 1024 / 1024}MB`);
    }, 5000); // 每5秒记录一次
    
  • CPU日志:结合process.cpuUsage()process.hrtime(),记录CPU使用率变化,例如:
    let lastCpuUsage = process.cpuUsage();
    let lastHr = process.hrtime();
    setInterval(() => {
      const currentCpu = process.cpuUsage(lastCpuUsage);
      const currentHr = process.hrtime(lastHr);
      const cpuTime = (currentCpu.user + currentCpu.system) / 1e6; // 微秒转毫秒
      const elapsedTime = (currentHr[0] * 1e9 + currentHr[1]) / 1e9; // 纳秒转秒
      const cpuUsage = (cpuTime / elapsedTime * 100).toFixed(2);
      console.log(`[${new Date().toISOString()}] CPU Usage: ${cpuUsage}%`);
      lastCpuUsage = process.cpuUsage();
      lastHr = process.hrtime();
    }, 5000);
    
  • 日志持久化:使用winstonpino等日志库,将资源使用情况写入文件,例如:
    const winston = require('winston');
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new winston.transports.File({ filename: 'resource-usage.log' })
      ]
    });
    setInterval(() => {
      const memory = process.memoryUsage();
      logger.info('Memory Usage', { rss: memory.rss, heapUsed: memory.heapUsed });
    }, 5000);
    

0