Node.js如何获取CPU使用率百分比?求代码修正方案
修正CPU使用率计算问题
原代码核心问题
- 计算逻辑偏差:
process.cpuUsage()返回的是当前进程从启动到现在的累计CPU时间,直接除以进程运行时间得到的是进程启动以来的平均使用率,而非实时使用率。 - 忽略多核因素:即使计算进程自身使用率,也需要结合CPU核心数修正,因为多核系统中进程可并行占用多个核心。
- 无法获取系统级使用率:原代码未使用系统层面的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
相关产品推荐
相关产品推荐

