MST

星途 面试题库

面试题:JavaScript实现Node进程CPU占用率监控

请用JavaScript编写一个模块,能够实时监控Node进程的CPU占用率,并将监控数据以一定格式返回。说明在实现过程中可能遇到的问题及解决方案。
22.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

实现代码

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
};

可能遇到的问题及解决方案

  1. 跨平台兼容性
    • 问题:不同操作系统获取CPU占用率的方式可能不同,例如Windows和Linux。
    • 解决方案:使用os模块来获取与操作系统无关的CPU统计信息。如果需要更精确的特定操作系统的信息,可以使用os.platform()判断操作系统,然后使用特定的方法(如在Windows下使用child_process.exec调用wmic命令)。
  2. 性能影响
    • 问题:频繁获取CPU占用率可能对Node进程本身的性能产生影响。
    • 解决方案:合理设置监控间隔时间,避免过于频繁的获取。例如上述代码中设置为1秒获取一次,可根据实际需求调整。
  3. 获取数据的准确性
    • 问题:由于CPU使用率是一个动态变化的值,获取的瞬间值可能无法完全代表一段时间内的平均使用情况。
    • 解决方案:可以通过多次获取并计算平均值,或者使用更复杂的算法(如指数加权移动平均)来平滑数据,以获得更准确的长期平均CPU使用率。