Получить использование ЦП в процентах - PullRequest
8 голосов
/ 06 августа 2020

Функция process.cpuUsage() отображает странные значения микросекунд. Как получить процент использования процессора?

Ответы [ 4 ]

4 голосов
/ 10 августа 2020

Альтернативный вариант, предполагающий, что вы запускаете узел под ОС linux / macos:

var exec = require("child_process").exec;

function getProcessPercent() {

  // GET current node process id.
  const pid = process.pid;
  console.log(pid);

  //linux command to get cpu percentage for the specific Process Id.
  var cmd = `ps up "${pid}" | tail -n1 | tr -s ' ' | cut -f3 -d' '`;

  setInterval(() => {
    //executes the command and returns the percentage value
    exec(cmd, function (err, percentValue) {
      if (err) {
        console.log("Command `ps` returned an error!");
      } else {
        console.log(`${percentValue* 1}%`);
      }
    });
  }, 1000);
}

getProcessPercent();

Если ваша ОС windows, ваша команда должна быть другой. Поскольку я не использую windows, я не могу сказать вам точную команду, но вы можете начать отсюда:

список задач

получить -process

WMI C

Вы также можете проверить платформу с помощью process.platform и выполнить условие if / else, установив правильную команду для указать c ОС.

2 голосов
/ 10 августа 2020

Вы можете достичь этого, используя дополнительный os собственный модуль для получения информации о ваших процессорах:

const os = require('os');

// Take the first CPU, considering every CPUs have the same specs
// and every NodeJS process only uses one at a time.
const cpus = os.cpus();
const cpu = cpus[0];

// Accumulate every CPU times values
const total = Object.values(cpu.times).reduce(
    (acc, tv) => acc + tv, 0
);

// Normalize the one returned by process.cpuUsage() 
// (microseconds VS miliseconds)
const usage = process.cpuUsage();
const currentCPUUsage = (usage.user + usage.system) * 1000;

// Find out the percentage used for this specific CPU
const perc = currentCPUUsage / total * 100;

console.log(`CPU Usage (%): ${perc}`);

Если вы хотите получить глобальное использование процессора (с учетом всех ваших процессоров), вы необходимо накапливать каждый раз каждого процессора, не только первого, но это должно быть менее полезно в большинстве случаев.

Обратите внимание, что только «системное» время может использовать больше, чем первый процессор, потому что вызовы могут запускать в других потоках, отделенных от ядра NodeJS.

Источники:

1 голос
/ 14 августа 2020

Попробуйте использовать приведенный ниже код, чтобы получить использование процессора в%

var startTime  = process.hrtime()
var startUsage = process.cpuUsage()

// spin the CPU for 500 milliseconds
var now = Date.now()
while (Date.now() - now < 500)

var elapTime = process.hrtime(startTime)
var elapUsage = process.cpuUsage(startUsage)

var elapTimeMS = secNSec2ms(elapTime)
var elapUserMS = secNSec2ms(elapUsage.user)
var elapSystMS = secNSec2ms(elapUsage.system)
var cpuPercent = Math.round(100 * (elapUserMS + elapSystMS) / elapTimeMS)

console.log('elapsed time ms:  ', elapTimeMS)
console.log('elapsed user ms:  ', elapUserMS)
console.log('elapsed system ms:', elapSystMS)
console.log('cpu percent:      ', cpuPercent)

function secNSec2ms (secNSec) {
  return secNSec[0] * 1000 + secNSec[1] / 1000000
}

попробуйте настроить secNSec2ms function на следующее, чтобы проверить, решает ли он вашу проблему.

function secNSec2ms(secNSec) {
  if (Array.isArray(secNSec))
  return secNSec[0] * 1000 + secNSec[1] / 1000000 return secNSec / 1000;
}
1 голос
/ 09 августа 2020

Прежде чем ответить, нам нужно позаботиться о нескольких фактах:

  • Node.js не использует только один ЦП, но каждая асинхронная операция c ввода-вывода может использовать дополнительные ЦП
  • время, возвращаемое process.cpuUsage, является совокупным для всех ЦП, используемых процессом Node.js

, поэтому для расчета использования ЦП Node.js с учетом всех ЦП хоста , мы могли бы использовать что-то вроде:

const ncpu = require("os").cpus().length;
let previousTime = new Date().getTime();
let previousUsage = process.cpuUsage();
let lastUsage;

setInterval(() => {
    const currentUsage = process.cpuUsage(previousUsage);

    previousUsage = process.cpuUsage();

    // we can't do simply times / 10000 / ncpu because we can't trust
    // setInterval is executed exactly every 1.000.000 microseconds
    const currentTime = new Date().getTime();
    // times from process.cpuUsage are in microseconds while delta time in milliseconds
    // * 10 to have the value in percentage for only one cpu
    // * ncpu to have the percentage for all cpus af the host

    // this should match top's %CPU
    const timeDelta = (currentTime - previousTime) * 10;
    // this would take care of CPUs number of the host
    // const timeDelta = (currentTime - previousTime) * 10 * ncpu;
    const { user, system } = currentUsage;

    lastUsage = { system: system / timeDelta, total: (system + user) / timeDelta, user: user / timeDelta };
    previousTime = currentTime;

    console.log(lastUsage);
}, 1000);

или мы можем прочитать значение lastUsage там, где оно нам нужно, а не распечатать его на консоли.

...