У меня есть функция, которая возвращает использование ядра ЦП с помощью библиотеки cpu-stat:

const cpuStat = require('cpu-stat')
var coreCount = cpuStat.totalCores()
var memArr = []

function getCoreUsage(i) {
    return new Promise(async(resolve) => {
        if (i === 0) {
            cpuStat.usagePercent({coreIndex: i,sampleMs: 1000,},
            async function(err, percent, seconds) {
                if (err) {resolve(console.log(err))}
                x = await percent
                resolve("Core0: " + x.toFixed(2) + "%");
            });
        } else {
            cpuStat.usagePercent({coreIndex: i,sampleMs: 1000,},
                async function(err, percent, seconds) {
                    if (err) {resolve(console.log(err))}
                    x = await percent
                    resolve(x);
            });
        }
    })
}

Эта функция вызывается всякий раз, когда клиент запрашивает определенный маршрут:

function singleCore() {
    return new Promise(async(resolve) => {
        for (i=0; i <= coreCount; i++) {
            if (i < coreCount) {core = await getCoreUsage(i), memArr.push(core)}
            else if (i === coreCount) {resolve(memArr), memArr = []}
        }
    })
}

Теперь это прекрасно работает на машинах с менее чем 8 ядрами. Проблема, с которой я сталкиваюсь, заключается в том, что если я (гипотетически) использую процессор с большим количеством ядер, такой как Xeon или Threadripper, время, необходимое для использования, будет близко к минуте или около того, потому что они могут иметь 56 или 64 ядра. соответственно. Чтобы решить эту проблему, я подумал о выполнении цикла for для каждого ядра в разных потоках, чтобы время сократилось до одной или двух секунд (CPUS с большим количеством ядер также имеет много потоков, поэтому это, вероятно, не будет проблемой ).
Но я не могу понять, как это сделать. Я просмотрел документацию child_process и думаю, что это, вероятно, можно сделать. Пожалуйста, поправьте меня, если я ошибаюсь. Кроме того, предложите лучший способ, если вы его знаете.

0
Nilanjan Mitra 15 Окт 2020 в 13:53

1 ответ

Лучший ответ

Эта функция usagePercent работает

  1. просмотр значений счетчика циклов в os.cpus[index] в объекте, возвращаемом пакетом os.
  2. задерживая выбранное время, возможно, с помощью setTimeout.
  3. снова посмотрев на количество циклов и вычислив разницу.

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

Или вы можете переработать код в пакете, чтобы выполнить вычисления для всех ядер на шаге 3 и вернуть массив, а не только одно число.

Или вы можете использовать Promise.all () для одновременного запуска этих тестов.

0
O. Jones 15 Окт 2020 в 11:17