Подтвердить что ты не робот

Как отлаживать node.js, вызвав 100% -ное использование процессора?

У меня есть приложение node, которое использует express и redis. На нашем сервере разработки после небольшого использования node начинает использовать 100% -ный процессор. Приложение по-прежнему отвечает, но верхние отчеты node используют 100%. Процессор не падает до перезапуска node.

Я не прикрепил его к какому-либо определенному маршруту или функции, вызывающим его.

Каков наилучший способ диагностики этой проблемы?

Я посмотрел на node -инспектор с профилировщиком v8, и он дал мне ту же ошибку, о которой сообщается здесь https://github.com/dannycoates/v8-profiler/issues/10

4b9b3361

Ответ 1

Вы можете профилировать свое приложение с галочкой узла.

  1. Установите node-tick помощью sudo npm -g install tick
  2. Запустите ваше приложение с включенным node --prof./app.js профиля node --prof./app.js
  3. Через некоторое время при загрузке процессора 100% остановите ваше приложение
  4. Вы можете увидеть v8.log в каталоге вашего приложения, теперь вы можете читать его с помощью node-tick-processor
  5. Запустите node-tick-processor и объясните результаты
  6. Загрузите v8.log в chrome://трассировка для анализа в виде дерева.

узел js процессор 100%

Ответ 2

Я нашел проблему, написав script, чтобы записать каждый запрос, а затем воспроизвести их.

Проблема была вызвана тем, что у меня был обратный вызов, который не возвращался.

myAsncFunc(function(err, data) {

    if (err) { callback(err) }

    //node kept going after the error was returned to the user.
    // make sure you, return callback(err)

})

Вот мой код replay.js для всех, кого это интересует.

var request = require('request');
var async = require('async');
var redis = require('redis');


var host = 'http://myhost.com';
var jobs = true;

var client = redis.createClient();

async.whilst(
    function () { return jobs; },
    function (callback) {
        client.lpop('history', function(err, url) {
            console.log(url);
            if (!url) {
                jobs = false;
                callback();
            }
            request.get({url:host+url}, function() {
                callback();
            });
        })
    },
    function (err) {
        console.log('done')
    }
);

И в вашем экспресс-приложении.

app.get('/*', function(req, res, next) {
    var url = req.originalUrl;
    redis.rpush('history', url);   
    next();
});

Это круто, потому что каждый элемент истории, который воспроизводится, будет добавлен снова в очередь, поэтому он будет постоянно петлиться и каждый раз, когда вы посещаете новую страницу, он добавит это в очередь.

Ответ 3

Я испытал также 100% -ное использование ЦП, пока я не выключил режим супервизора (вызывая перезапуск node при изменении файла).

Это, вероятно, не отвечает на этот вопрос, но в случае, если какой-то новичок, как я, беспокоится о загрузке процессора, это может быть так.

Ответ 4

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

Если вы не можете запустить профиль, тогда трудно узнать, какой метод выдает процессор. Еще одна вещь - изучить экспресс-журнал с помощью промежуточного программного обеспечения logger http://senchalabs.github.com/connect/middleware-logger.html

Ответ 5

Это может быть потому, что вы количество файлов в прямом. например, папка node_modules. вам нужно использовать параметр -i, чтобы игнорировать эту папку. поэтому должно быть так: приложение supervisor -i./node_modules app.

Ответ 6

Решено: - Я MacBook Air [OS Mohave] Пользователь, та же проблема со мной, я просто вышел из Sublime и начал использовать VS Code, проблема исчезла. Я думаю, что проблема с Sublime JSLinter.