monogodbのinternalQuery ExecMaxBlocking SortByttes異常修復

2434 ワード

現象
nodeが実行しているサービスに異常が発生しました.ログを見て、次のようなエラーが見つかりました.
MongoError: QueryFailure flag set on getmore command
    at Object.toError (e:\code\api\mobile
odejs
ode_modules\mongodb\lib\mongodb\utils.js:114:11) at e:\code\api\mobile
odejs
ode_modules\mongodb\lib\mongodb\cursor.js:854:31 at e:\code\api\mobile
odejs
ode_modules\mongodb\lib\mongodb\db.js:1905:9 at Server.Base._callHandler (e:\code\api\mobile
odejs
ode_modules\mongodb\lib\mongodb\connection\base.js:453:41) at e:\code\api\mobile
odejs
ode_modules\mongodb\lib\mongodb\connection\server.js:488:18 at MongoReply.parseBody (e:\code\api\mobile
odejs
ode_modules\mongodb\lib\mongodb\responses\mongo_reply.js:68:5) at . (e:\code\api\mobile
odejs
ode_modules\mongodb\lib\mongodb\connection\server.js:446:20) at emitOne (events.js:96:13) at emit (events.js:188:7)
このエラーを調べましたが、具体的な原因が見つかりませんでした.その後、monogodb\cursor.js 854行で、印刷resultを追加します.具体的なエラー情報は以下の通りです.Overflow sort stage buffered data usage exceeds in internal limit montoがsort文を実行する時、メモリが最大32 Mです.データ量が大きいと、この制限を超えて投げ出します.
解決策
1、sort文のフィールドにインデックスを作成します.例えば、sort(endDate:-1,createTime:-1))のインデックスを作成します.db.activity.create Index({endDate:-1,createTime:-1}.そのうちacitivityは集合名です.
2、メモリ制限を追加するには、adminデータベースの下でroleがrootのアカウントに設定する必要があります.例えば100 Mに設定します.
use admin
db.auth("adminuser","passwd")
db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: 104857600})
クエリーの性能とサーバのリソース占有を総合して、インデックスを作成する方法を推奨します.
その他の注意点
sort以外にも、aggregateにもメモリ制限があります.これはallowDiskUseパラメータを使用して、ハードディスクキャッシュの中間データを使用することができます.詳細は以下の通りです
db.activity.aggregate(
        [{ $unwind: '$applyment' },
        { $match: { 'applyment.items.value': req.query.uid }},
        { $project : {id:1,title: 1, 'applyment.approve': 1,'applyment.createTime': 1, endDate: 1}},
        { $sort:{ 'applyment.createTime': -1 }},
        { $skip:(result.pageNumber - 1) * result.pageSize},
        { $limit:result.pageSize}],
        { allowDiskUse: true})
インデックスの設定について
1、monogoDB 3.0からensureIndexが破棄されました.これからはdb.co llection.reate Indexの別名だけです.2、サブオブジェクトの属性設定索引db.activity.create Index(「{appyment.createTime]」:-1})3、配列内蔵トップ位置にインデックスdb.activity.creatIndex(「"appyment.items.value"))):1))