Как узнать% использования ЦП для Node.js процесс?

#node.js #cpu-usage

#node.js #загрузка процессора

Вопрос:

Есть ли способ узнать использование ЦП в% для node.js процесс с помощью кода. Так что, когда node.js приложение запущено на сервере и обнаруживает, что процессор превышает определенный%, затем оно выводит предупреждение или выводит на консоль.

Ответ №1:

В системах * nix можно получить статистику процесса, прочитав виртуальный файл /proc/[pid]/stat .

Например, это будет проверять загрузку процессора каждые десять секунд и выводить на консоль, если она превышает 20%. Это работает путем проверки количества тактов процессора, используемых процессом, и сравнения значения со вторым измерением, сделанным секундой позже. Разница заключается в количестве тактов, используемых процессом в течение этой секунды. В системах POSIX количество тактов в секунду составляет 10000 (на процессор), поэтому деление на 10000 дает нам процент.

 var fs = require('fs');

var getUsage = function(cb){
    fs.readFile("/proc/"   process.pid   "/stat", function(err, data){
        var elems = data.toString().split(' ');
        var utime = parseInt(elems[13]);
        var stime = parseInt(elems[14]);

        cb(utime   stime);
    });
}

setInterval(function(){
    getUsage(function(startTime){
        setTimeout(function(){
            getUsage(function(endTime){
                var delta = endTime - startTime;
                var percentage = 100 * (delta / 10000);

                if (percentage > 20){
                    console.log("CPU Usage Over 20%!");
                }
            });
        }, 1000);
    });
}, 10000);
  

Комментарии:

1. Это на процессор или на ядро процессора?

Ответ №2:

Попробуйте посмотреть на этот код: https://github.com/last/healthjs

Сетевая служба для получения ЦП удаленной системы и получения предупреждений об использовании ЦП…

Health.js обслуживает 2 основных режима: «режим потоковой передачи» и «режим событий». Режим потоковой передачи позволяет клиенту подключаться и получать потоковые данные об использовании ЦП. Режим события позволяет Health.js уведомлять удаленный сервер, когда загрузка процессора достигает определенного порога. Оба режима могут быть запущены одновременно…

Комментарии:

1. Это не обновлялось в течение длительного времени и, похоже, больше не работает.

2. Вы не отмечаете меня за это … это не моя вина! Я сделал этот комментарий год назад.

3. Ответы помечаются, чтобы другие люди не называли их правдой, в этом нет ничего личного.

4. Вы должны удалить этот ответ, если знаете, что он больше не является правильным. Или, по крайней мере, OP должен удалить его проверку правильного ответа.

5. Это ТАК, а не ошибка сервера … внесите свой вклад в код или используйте его в качестве примера.

Ответ №3:

Теперь вы можете использовать модуль ОС.

 var os = require('os');
var loads = os.loadavg();
  

Это дает вам среднее значение нагрузки за последние 60 секунд, 5 минут и 15 минут.
Однако это не дает вам использование ЦП в%.

Комментарии:

1. средняя загрузка для всей системы. Вопрос заключается в получении статистики для текущего процесса.

2. ВНИМАНИЕ!! Возвращает [0,0,0] в Windows.

3. @origin1tech чтобы включить его в Windows, используйте loadavg-windows из npm

Ответ №4:

Используйте функцию node process.CPUUsage (введенную в node v6.1.0). Он показывает время, потраченное ЦП на ваш процесс узла. Пример взят из документов:

 const previousUsage = process.cpuUsage();
// { user: 38579, system: 6986 }

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

// At this moment you can expect result 100%
// Time is *1000 because cpuUsage is in us (microseconds)
const usage = process.cpuUsage(previousUsage);
const result = 100 * (usage.user   usage.system) / ((Date.now() - startDate) * 1000) 
console.log(result);

// set 2 sec "non-busy" timeout
setTimeout(function() {
    console.log(process.cpuUsage(previousUsage);
    // { user: 514883, system: 11226 }    ~ 0,5 sec
    // here you can expect result about 20% (0.5s busy of 2.5s total runtime, relative to previousUsage that is first value taken about 2.5s ago)
}, 2000);
  

Комментарии:

1. Он попросил процент, хотя

2. @AmitB. чтобы получить%, используйте простую математику. Вам нужно разделить результат на время, прошедшее между измерениями. Процентный результат = 100 * (результат.user результат.system) / ((timeOfCurrentDateNow — timeOfPreviousDateNow) * 1000). Время умножается на 1000, чтобы преобразовать мс в США — process.CPUUsage возвращает результаты в США. Обратите внимание, что это результат для процесса с одним узлом, работающего на одном логическом ядре.

3. process.cpuUsage просто возвращает, сколько времени прошло

4. @EvgenyKolyakov да, и вы можете использовать это для расчета загрузки процессора в% за определенный период времени (в приведенном выше случае анализируется, сколько времени процессор потратил на этот процесс за последние 500 миллисекунд. Чтобы получить% в этом конкретном случае, достаточно сделать usageInPercent = (usage.user usage.system)/500 .

5. Кстати. концепция использования ЦП имеет смысл только в случае ее измерения в каком-то временном окне (например, в последнюю минуту или секунду)

Ответ №5:

см. раздел Использование узла для отслеживания использования ЦП и памяти процесса (не системы)

Ответ №6:

Другой вариант — использовать пакет node-red-contrib-os