実際に使用する前に、 MongoDBのパフォーマンスをテストしようとしています。1 秒あたりに更新できるドキュメントの数を確認しようとしています。私は C# (Mono + Ubuntu) MongoDB Driver v1.9 と MongoDB v2.4.6 を使用しています。
書き込みパフォーマンスで最も効果的な MongoDB パラメータの 1 つはWrite Concern
. ドキュメントに記載されているように、書き込み懸念の最も緩和された値は であり-1
、0
最後1
に最も遅い値です。
検索した結果、次のように接続文字列に埋め込まれた C# で書き込み懸念を設定できることがわかりました。
var client = new MongoClient("mongodb://localhost/?w=-1");
のさまざまな値をいじってみた結果は次のw
とおりです。
- !に設定
w
すると、最速の結果が得られます。1
- 設定は28倍
w=0
より遅い!w=1
w=-1
エラーメッセージで例外がスローされますW value must be greater than or equal to zero
!
これらの結果について誰か説明がありますか? 私は何か間違ったことをしていますか?
[アップデート]
テスト手順を設定する必要があると思います。おそらく、その中に何かが隠されています。だからここに行く:
1 つのコレクションに 1 億のドキュメントを含むデータベースがあります。各ドキュメントは、mongo シェルを使用して次のように作成されます。
{ "counter" : 0, "last_update" : new Date() }
の出力は次のdb.collection.stats();
とおりです。
{
"ns" : "test.collection",
"count" : 100000100,
"size" : 6400006560,
"avgObjSize" : 64.0000015999984,
"storageSize" : 8683839472,
"numExtents" : 27,
"nindexes" : 2,
"lastExtentSize" : 2146426864,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 5769582448,
"indexSizes" : {
"_id_" : 3251652432,
"last_update_1" : 2517930016
},
"ok" : 1
}
Ubuntu 12.04でMono 3.2.1を使用して、 MongoDBに接続し、次のようにドキュメントを更新しようとするC#プロジェクトを作成しました。
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);
Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
このコードの機能を要約すると、最も古いものを選択し、現在の日付にlast_update
設定すると同時に、カウンターをインクリメントします (更新は 2 段階で行われます)。last_update
、、、、の 4 種類のそれぞれについて、このコードを 10kWrite Concerns
実行w=-1
しましw=0
た。whileは例外をスローして結果を出しませんが、残りの結果は次のとおりです。w=1
w=1&j=true
w=-1
図は少し読みにくいので、同じ結果を数値で示します。
w=-1 w=0 w=1 w=1&j=true
Average N/A 244.0948611492 7064.5143923477 238.1846428156
STDEV N/A 1.7787457992 511.892765742 21.0230097306
w=0
そして質問は: がなぜよりもはるかに遅くw=1
、なぜw=-1
サポートされていないのか、誰か説明がありますか?
[アップデート]
RequestStart
また、次のようにコードでテストしました。
using (server.RequestStart(database)) {
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);
Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
}
いずれの結果にも大きな影響はありませんでした。