实现代码
const os = require('os');
const { exec } = require('child_process');
function getCpuUsage() {
return new Promise((resolve, reject) => {
const startUsage = os.cpus().reduce((acc, cpu) => acc + cpu.times.user + cpu.times.nice + cpu.times.sys + cpu.times.idle + cpu.times.irq, 0);
const startTime = process.hrtime();
setTimeout(() => {
const endUsage = os.cpus().reduce((acc, cpu) => acc + cpu.times.user + cpu.times.nice + cpu.times.sys + cpu.times.idle + cpu.times.irq, 0);
const endTime = process.hrtime(startTime);
const elapsedTime = endTime[0] * 1e9 + endTime[1];
const elapsedUsage = endUsage - startUsage;
const cpuUsage = (elapsedUsage / elapsedTime * 100).toFixed(2);
resolve(cpuUsage);
}, 1000);
});
}
async function monitorCpuUsage() {
setInterval(async () => {
try {
const usage = await getCpuUsage();
console.log(`当前CPU占用率: ${usage}%`);
} catch (error) {
console.error('获取CPU占用率错误:', error);
}
}, 1000);
}
module.exports = {
monitorCpuUsage
};
可能遇到的问题及解决方案
- 跨平台兼容性
- 问题:不同操作系统获取CPU占用率的方式可能不同,例如Windows和Linux。
- 解决方案:使用
os
模块来获取与操作系统无关的CPU统计信息。如果需要更精确的特定操作系统的信息,可以使用os.platform()
判断操作系统,然后使用特定的方法(如在Windows下使用child_process.exec
调用wmic
命令)。
- 性能影响
- 问题:频繁获取CPU占用率可能对Node进程本身的性能产生影响。
- 解决方案:合理设置监控间隔时间,避免过于频繁的获取。例如上述代码中设置为1秒获取一次,可根据实际需求调整。
- 获取数据的准确性
- 问题:由于CPU使用率是一个动态变化的值,获取的瞬间值可能无法完全代表一段时间内的平均使用情况。
- 解决方案:可以通过多次获取并计算平均值,或者使用更复杂的算法(如指数加权移动平均)来平滑数据,以获得更准确的长期平均CPU使用率。