You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node进程标准化CPU使用率计算与htop输出不符,如何修正?

Node.js进程CPU使用率计算与htop结果不一致的问题分析与修复

我想计算Node.js进程的标准化CPU百分比,让结果和htop里对应PID的输出一致,但一直没成功。下面是我的代码和htop的输出截图,怀疑问题出在setInterval的调用上,希望能做一个可以长期运行、能查看CPU使用率的进程,找出计算里的错误。

import { cpuUsage } from "node:process";
import { cpus } from "os";

function basicCpuUsage() {
  const startTime = process.hrtime();
  const startUsage = cpuUsage();
  const numCpus = cpus().length;

  const add = 1 + 1; // 试图让CPU做点工作?

  const usageDiff = cpuUsage(startUsage); // 获取与起始点的时间差
  const endTime = process.hrtime(startTime); // 流逝的总时间
  const usageMS = (usageDiff.user + usageDiff.system) / 1e3;
  const totalMS = endTime[0] * 1e3 + endTime[1] / 1e6;

  const cpuPercent = (usageMS / totalMS) * 100;
  const normTotal = usageMS / numCpus; // 每个CPU的平均使用时间
  const normPercent = (normTotal / totalMS) * 100;

  console.log({
    cpuPercent: cpuPercent.toFixed(2),
    normPercent: normPercent.toFixed(2),
  });
}

process.title = "CPU Test";
const { pid } = process;
console.log({ pid });
const title = setInterval(() => {
  basicCpuUsage();
}, 1000);

htop输出截图


问题根源

  • 采样窗口过短:basicCpuUsage函数内从获取起始数据到计算差值之间几乎无实际CPU负载,采样窗口极短,计算结果无法反映进程真实CPU消耗,和htop基于长周期的统计逻辑不符。
  • 独立采样逻辑错误:每秒调用的basicCpuUsage都是单次独立采样,没有持续跟踪进程在时间窗口内的CPU使用情况,无法得到和htop一致的长期统计结果。
  • 标准化计算逻辑偏差:htop的进程CPU使用率是进程总CPU占用时间 / 采样窗口时间 × 100%,多核环境下数值可超过100%(如占用2个核心满负载时为200%);你的normPercent将总使用时间除以核心数再计算,和htop统计逻辑完全相反。

修复后的代码

以下是可长期运行、输出与htop一致的CPU使用率代码:

import { cpuUsage } from "node:process";
import { cpus } from "os";

// 保存上一次的采样基准
let prevUsage = cpuUsage();
let prevTime = process.hrtime();
const numCpus = cpus().length;

function calculateCpuUsage() {
  // 基于上一次基准计算当前周期的CPU使用
  const currentUsage = cpuUsage(prevUsage);
  const currentTime = process.hrtime(prevTime);

  // 计算周期内流逝的总毫秒数
  const elapsedMs = currentTime[0] * 1000 + currentTime[1] / 1e6;
  // 计算进程消耗的总CPU毫秒数(用户态+内核态)
  const cpuMs = (currentUsage.user + currentUsage.system) / 1e3;

  // 与htop逻辑一致的CPU使用率
  const cpuPercent = (cpuMs / elapsedMs) * 100;

  console.log({
    htopLikePercent: cpuPercent.toFixed(2) + "%",
    // 可选:单核心标准化使用率(0-100%)
    normPercent: (cpuPercent / numCpus).toFixed(2) + "%"
  });

  // 更新采样基准,用于下一次计算
  prevUsage = cpuUsage();
  prevTime = process.hrtime();
}

process.title = "CPU Test";
const { pid } = process;
console.log(`进程PID: ${pid}`);

// 每秒计算一次,匹配htop更新频率
setInterval(calculateCpuUsage, 1000);

修复说明

  • 持续跟踪采样:通过保留上一次的CPU使用数据和时间戳,每次计算都基于1秒窗口内的真实消耗,和htop统计逻辑对齐。
  • 修正计算逻辑:直接用进程总CPU时间除以采样窗口时间得到使用率,和htop输出一致;若需单核心标准化数值,再除以核心数即可。
  • 模拟CPU负载(可选):如果需要测试高CPU使用率场景,可添加如下代码:
// 生成CPU负载,每2秒消耗500ms CPU
function generateLoad() {
  const start = Date.now();
  while (Date.now() - start < 500) {}
}
setInterval(generateLoad, 2000);

内容的提问来源于stack exchange,提问作者pythonNovice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:25:26