6

nodetime を使用して、node.js アプリの高い CPU 使用率を分析しています。CPU 使用率の 30% 以上が Mongoose によるものです。

ここに画像の説明を入力

次の最大の原因は、わずか 5% のガベージ コレクターです。

Mongooseは CPU 使用率が高くなる可能性があり、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 を消費している) ことに注意してください。

4

1 に答える 1

17

Mongoose では、単純な JavaScript ドキュメント以外は何も必要としない大規模な結果セットを持つクエリに対してリーンオプションを使用することが重要です。これにより、ネイティブ ドライバーを直接使用する場合と同等のパフォーマンスが得られるはずです。

たとえば、上記の場合は次のようになります。

this.model.find({$or: or}, fields).lean().exec(function(e, matches) {
    // ... excluded for brevity
}).bind(this));
于 2013-02-26T19:29:35.367 に答える