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

Node.js如何获取CPU使用率百分比?求代码修正方案

修正CPU使用率计算问题

原代码核心问题

  1. 计算逻辑偏差:process.cpuUsage()返回的是当前进程从启动到现在的累计CPU时间,直接除以进程运行时间得到的是进程启动以来的平均使用率,而非实时使用率。
  2. 忽略多核因素:即使计算进程自身使用率,也需要结合CPU核心数修正,因为多核系统中进程可并行占用多个核心。
  3. 无法获取系统级使用率:原代码未使用系统层面的CPU时间统计,无法得到整个系统的CPU负载情况。

方案1:获取当前进程的实时CPU使用率

通过两次采样进程CPU时间和时间戳,计算时间窗口内的实时使用率,同时适配多核环境:

import os from "os";
import process from "process";

export const getCpuInfo = async () => {
    // 第一次采样
    const startUsage = process.cpuUsage();
    const startTime = Date.now();

    // 100ms采样窗口(可调整:时长越短越实时但波动大,越长越稳定但延迟高)
    await new Promise(resolve => setTimeout(resolve, 100));

    // 第二次采样
    const endUsage = process.cpuUsage(startUsage);
    const endTime = Date.now();

    // 计算窗口时长(秒)
    const elapsedTime = (endTime - startTime) / 1000;
    // 进程窗口内总CPU时间(微秒转秒)
    const processCpuTime = (endUsage.user + endUsage.system) / 1e6;
    // 修正多核后的进程CPU使用率
    const cpuUsagePercentage = (processCpuTime / (elapsedTime * os.cpus().length)) * 100;

    // 获取CPU硬件信息
    const [firstCpu] = os.cpus();
    const modelName = firstCpu.model;
    const modelSpeed = firstCpu.speed;

    return {
        cpuSpeed: formatHertz(modelSpeed),
        cpuModel: modelName,
        cpuCores: os.cpus().length,
        cpuParallelism: os.availableParallelism(),
        cpuUsage: `${cpuUsagePercentage.toFixed(2)}%`
    };
};

function formatHertz(megaHertz) {
    try {
        const hertz = Number(megaHertz);
        const ghz = hertz / 1000;
        return `${ghz.toFixed(2)} Ghz`;
    } catch (err) {
        return String(err);
    }
}

方案2:获取系统整体的实时CPU使用率

通过两次采样系统各CPU核心的时间统计,计算系统整体的空闲时间占比,进而得到真实负载:

import os from "os";
import process from "process";

// 单次采样系统CPU总时间与空闲时间
function getSystemCpuTimes() {
    const cpus = os.cpus();
    let totalTime = 0;
    let idleTime = 0;

    cpus.forEach(cpu => {
        for (const time of Object.values(cpu.times)) {
            totalTime += time;
        }
        idleTime += cpu.times.idle;
    });

    return { totalTime, idleTime };
}

export const getCpuInfo = async () => {
    // 第一次采样
    const startTimes = getSystemCpuTimes();
    const startTime = Date.now();

    // 100ms采样窗口
    await new Promise(resolve => setTimeout(resolve, 100));

    // 第二次采样
    const endTimes = getSystemCpuTimes();
    const endTime = Date.now();

    // 计算时间差
    const elapsedTotal = endTimes.totalTime - startTimes.totalTime;
    const elapsedIdle = endTimes.idleTime - startTimes.idleTime;

    // 系统CPU使用率 = (总时间差 - 空闲时间差) / 总时间差 * 100
    const cpuUsagePercentage = ((elapsedTotal - elapsedIdle) / elapsedTotal) * 100;

    // 获取CPU硬件信息
    const [firstCpu] = os.cpus();
    const modelName = firstCpu.model;
    const modelSpeed = firstCpu.speed;

    return {
        cpuSpeed: formatHertz(modelSpeed),
        cpuModel: modelName,
        cpuCores: os.cpus().length,
        cpuParallelism: os.availableParallelism(),
        cpuUsage: `${cpuUsagePercentage.toFixed(2)}%`
    };
};

function formatHertz(megaHertz) {
    try {
        const hertz = Number(megaHertz);
        const ghz = hertz / 1000;
        return `${ghz.toFixed(2)} Ghz`;
    } catch (err) {
        return String(err);
    }
}

补充说明

  • 两种方案均通过时间窗口采样获取实时使用率,解决了原代码的平均使用率问题。
  • Windows系统下os.cpus()和process.cpuUsage()的行为完全符合预期,无需额外兼容处理。
  • 采样窗口时长可根据实际需求灵活调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:40:17