Как отлаживать node.js, вызвав 100% -ное использование процессора?
У меня есть приложение node, которое использует express и redis. На нашем сервере разработки после небольшого использования node начинает использовать 100% -ный процессор. Приложение по-прежнему отвечает, но верхние отчеты node используют 100%. Процессор не падает до перезапуска node.
Я не прикрепил его к какому-либо определенному маршруту или функции, вызывающим его.
Каков наилучший способ диагностики этой проблемы?
Я посмотрел на node -инспектор с профилировщиком v8, и он дал мне ту же ошибку, о которой сообщается здесь
https://github.com/dannycoates/v8-profiler/issues/10
Ответы
Ответ 1
Вы можете профилировать свое приложение с галочкой узла.
- Установите
node-tick
помощью sudo npm -g install tick
- Запустите ваше приложение с включенным
node --prof./app.js
профиля node --prof./app.js
- Через некоторое время при загрузке процессора 100% остановите ваше приложение
- Вы можете увидеть v8.log в каталоге вашего приложения, теперь вы можете читать его с помощью node-tick-processor
- Запустите
node-tick-processor
и объясните результаты - Загрузите 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.