Mongoose (модуль node.js) вызывает высокую загрузку процессора

Я использую nodetime, чтобы проанализировать использование центрального процессора моего приложения node.js. Более 30% использования ЦП приходится на Mongoose:

enter image description here

Следующим крупнейшим виновником, всего лишь 5%, является сборщик мусора.

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

Здесь функция "Geocode.decodeMnay" вызвала эту конкретную точку доступа...

Geocode.prototype.decodeMany = function(strs, callback)
{
    var or = [],
        map = {},
        fields = {'woeid': 1, 'matched_queries': 1, 'latitude': 1, 'longitude': 1, 'radius': 1, 'name': 1},
        unique = [];

    strs = _.uniq(strs);
    for(var k=0; k<strs.length; k++)
        or.push({'matched_queries':strs[k].trim()});    

    this.model.find({$or: or}, fields, (function(e,matches){
        // ... excluded for brevity
    }).bind(this));
};

Как еще я могу ускорить эту точку доступа?

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

Ответ 1

С Mongoose важно использовать параметр lean для запросов с большими наборами результатов, где вам не нужно ничего, кроме простого Сами документы JavaScript. Это должно обеспечить производительность, сравнимую с непосредственным использованием собственного драйвера.

Например, в вышеприведенном случае это будет:

this.model.find({$or: or}, fields).lean().exec(function(e, matches) {
    // ... excluded for brevity
}).bind(this));