4

Mongodbからどのようなスループットが得られるかを確認するために、いくつかのテストを行っています。ドキュメントには、上限付きコレクションが最速のオプションであると記載されています。しかし、私は通常のコレクションにはるかに速く書き込むことができることに気付くことがよくあります。正確なテストによっては、通常のコレクションで2倍のスループットが得られることがよくあります。

私は何かが足りないのですか?これをトラブルシューティングするにはどうすればよいですか?

私は、コレクションに約64,000のドキュメントをできるだけ速く書き込む非常に単純なC++プログラムを持っています。合計時間と、データベースを待機している時間を記録します。コレクション名だけを変更すると、上限付きコレクションと通常のコレクションの明確な違いがわかります。

> use tutorial
switched to db tutorial
> db.system.namespaces.find()
{ "name" : "tutorial.system.indexes" }
{ "name" : "tutorial.persons.$_id_" }
{ "name" : "tutorial.persons" }
{ "name" : "tutorial.persons.$age_1" }
{ "name" : "tutorial.alerts.$_id_" }
{ "name" : "tutorial.alerts" }
{ "name" : "tutorial.capped.$_id_" }
{ "name" : "tutorial.capped", "options" : { "create" : "capped", "capped" : true, "size" : 100000000 } }
> db.alerts.stats()
{
    "ns" : "tutorial.alerts",
    "count" : 400000,
    "size" : 561088000,
    "avgObjSize" : 1402.72,
    "storageSize" : 629612544,
    "numExtents" : 16,
    "nindexes" : 1,
    "lastExtentSize" : 168730624,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 12991664,
    "indexSizes" : {
        "_id_" : 12991664
    },
    "ok" : 1
}
> db.capped.stats()
{
    "ns" : "tutorial.capped",
    "count" : 62815,
    "size" : 98996440,
    "avgObjSize" : 1576,
    "storageSize" : 100003840,
    "numExtents" : 1,
    "nindexes" : 1,
    "lastExtentSize" : 100003840,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 2044000,
    "indexSizes" : {
        "_id_" : 2044000
    },
    "capped" : true,
    "max" : 2147483647,
    "ok" : 1
}

Linuxバージョン:3.4.11-1.fc16.x86_64

mongoバージョン:dbバージョンv2.2.2、pdfileバージョン4.5

これは、Mongodbサーバーと私のテストクライアントを実行するだけの専用マシンです。このテストでは、マシンは途方もなく圧倒されています。

4

2 に答える 2

3

問題がわかりました。上で引用した Web ページでは、「インデックスなし」でキャップされたコレクションが高いパフォーマンスを提供すると述べています。しかし…</p>

http://docs.mongodb.org/manual/core/indexes/には、「バージョン 2.2 より前は、キャップされたコレクションには _id フィールドがありませんでした。2.2 では、ローカル データベースのものを除き、すべてのキャップされたコレクションに _id フィールドがあります。」

ローカル データベースの上限付きコレクションに書き込む別のバージョンのテストを作成しました。案の定、このコレクションにはインデックスがなく、私のスループットははるかに高かったです!

おそらく、 http://docs.mongodb.org/manual/core/capped-collections/にあるキャップ付きコレクションの概要で、この点が明確になるはずです。

于 2013-01-18T17:04:06.317 に答える
1

上限のあるコレクションは、挿入順序の保持を保証します。その結果、クエリは挿入順にドキュメントを返すためにインデックスを必要としません。このインデックス作成のオーバーヘッドがなければ、より高い挿入スループットをサポートできます。

上記の定義によれば、キャップされたコレクションへのインデックスの挿入がない場合、通常のコレクションへの挿入よりも高速である必要はありません。したがって、インデックスがなく、キャッシュなどの上限付きコレクションを使用する理由が他にない場合は、最後のn個の要素を表示することで、通常のコレクションを使用することをお勧めします。

上限付きコレクションは、挿入順序がディスク上の順序(自然な順序)と同じであることを保証し、ドキュメントサイズを増やす更新を禁止することによってそうします。上限のあるコレクションでは、元のドキュメントサイズに適合する更新のみが許可されるため、ドキュメントがディスク上の場所を変更することはありません。

于 2013-01-18T07:59:42.440 に答える