0

私はいくつかのNoSQLソリューションをテストしており、主に読み取りパフォーマンスに焦点を当てています。今日はMongoDbの日でした。テストマシンは、クアッドコアXeon@2.93GHzと8GBのRAMを搭載したVMです。

私はデータベースと最大100.000のドキュメントを含む単一のコレクションのみでテストしています。BSONドキュメントのサイズは約20Kbで、多かれ少なかれです。

私が使用している管理対象オブジェクトは次のとおりです。

private class Job
{
    public int Id { get; set; }
    public string OrganizationName { get; set; }
    public List<string> Categories { get; set; }
    public List<string> Industries { get; set; }
    public int Identifier { get; set; }
    public string Description { get; set; }
}

テストプロセス:

-100スレッドを作成します。

-すべてのスレッドを開始します。

-各スレッドは、コレクションから20個のランダムなドキュメントを読み取ります。

これが私が使用しているselectメソッドです:

private static void TestSelectWithCursor(object state)
{
    resetEvent.WaitOne();

    MongoCollection jobs = (state as MongoCollection);
    var q = jobs.AsQueryable<Job>();
    Random r = new Random(938432094);
    List<int> ids = new List<int>();
    for (int i = 0; i != 20; ++i)
    {
        ids.Add(r.Next(1000, 100000));
    }
    Stopwatch sw = Stopwatch.StartNew();
    var subset = from j in q
                 where j.Id.In(ids)
                 select j;

    int count = 0;
    foreach (Job job in subset)
    {
        count++;
    }
    Console.WriteLine("Retrieved {0} documents in {1} ms.", count, sw.ElapsedMilliseconds);
    ThreadsCount++;
}

「count++」は、カーソルを取得した後に何かをしているふりをするためのものなので、無視してください。

とにかく、アイデアは私が非常に遅い読み取り時間であるように思われるものを手に入れるということです。これは典型的なテスト結果です。

> 100 threads created.
> 
> Retrieved 20 documents in 272 ms. Retrieved 20 documents in 522 ms.
> Retrieved 20 documents in 681 ms. Retrieved 20 documents in 732 ms.
> Retrieved 20 documents in 769 ms. Retrieved 20 documents in 843 ms.
> Retrieved 20 documents in 1038 ms. Retrieved 20 documents in 1139 ms.
> Retrieved 20 documents in 1163 ms. Retrieved 20 documents in 1170 ms.
> Retrieved 20 documents in 1206 ms. Retrieved 20 documents in 1243 ms.
> Retrieved 20 documents in 1322 ms. Retrieved 20 documents in 1378 ms.
> Retrieved 20 documents in 1463 ms. Retrieved 20 documents in 1507 ms.
> Retrieved 20 documents in 1530 ms. Retrieved 20 documents in 1557 ms.
> Retrieved 20 documents in 1567 ms. Retrieved 20 documents in 1617 ms.
> Retrieved 20 documents in 1626 ms. Retrieved 20 documents in 1659 ms.
> Retrieved 20 documents in 1666 ms. Retrieved 20 documents in 1687 ms.
> Retrieved 20 documents in 1711 ms. Retrieved 20 documents in 1731 ms.
> Retrieved 20 documents in 1763 ms. Retrieved 20 documents in 1839 ms.
> Retrieved 20 documents in 1854 ms. Retrieved 20 documents in 1887 ms.
> Retrieved 20 documents in 1906 ms. Retrieved 20 documents in 1946 ms.
> Retrieved 20 documents in 1962 ms. Retrieved 20 documents in 1967 ms.
> Retrieved 20 documents in 1969 ms. Retrieved 20 documents in 1977 ms.
> Retrieved 20 documents in 1996 ms. Retrieved 20 documents in 2005 ms.
> Retrieved 20 documents in 2009 ms. Retrieved 20 documents in 2025 ms.
> Retrieved 20 documents in 2035 ms. Retrieved 20 documents in 2066 ms.
> Retrieved 20 documents in 2093 ms. Retrieved 20 documents in 2111 ms.
> Retrieved 20 documents in 2133 ms. Retrieved 20 documents in 2147 ms.
> Retrieved 20 documents in 2150 ms. Retrieved 20 documents in 2152 ms.
> Retrieved 20 documents in 2155 ms. Retrieved 20 documents in 2160 ms.
> Retrieved 20 documents in 2166 ms. Retrieved 20 documents in 2196 ms.
> Retrieved 20 documents in 2202 ms. Retrieved 20 documents in 2254 ms.
> Retrieved 20 documents in 2256 ms. Retrieved 20 documents in 2262 ms.
> Retrieved 20 documents in 2263 ms. Retrieved 20 documents in 2285 ms.
> Retrieved 20 documents in 2326 ms. Retrieved 20 documents in 2336 ms.
> Retrieved 20 documents in 2337 ms. Retrieved 20 documents in 2350 ms.
> Retrieved 20 documents in 2372 ms. Retrieved 20 documents in 2384 ms.
> Retrieved 20 documents in 2412 ms. Retrieved 20 documents in 2426 ms.
> Retrieved 20 documents in 2457 ms. Retrieved 20 documents in 2473 ms.
> Retrieved 20 documents in 2521 ms. Retrieved 20 documents in 2528 ms.
> Retrieved 20 documents in 2604 ms. Retrieved 20 documents in 2659 ms.
> Retrieved 20 documents in 2670 ms. Retrieved 20 documents in 2687 ms.
> Retrieved 20 documents in 2961 ms. Retrieved 20 documents in 3234 ms.
> Retrieved 20 documents in 3434 ms. Retrieved 20 documents in 3440 ms.
> Retrieved 20 documents in 3452 ms. Retrieved 20 documents in 3466 ms.
> Retrieved 20 documents in 3502 ms. Retrieved 20 documents in 3524 ms.
> Retrieved 20 documents in 3561 ms. Retrieved 20 documents in 3611 ms.
> Retrieved 20 documents in 3652 ms. Retrieved 20 documents in 3655 ms.
> Retrieved 20 documents in 3666 ms. Retrieved 20 documents in 3711 ms.
> Retrieved 20 documents in 3742 ms. Retrieved 20 documents in 3821 ms.
> Retrieved 20 documents in 3850 ms. Retrieved 20 documents in 4020 ms.
> Retrieved 20 documents in 5143 ms. Retrieved 20 documents in 6607 ms.
> Retrieved 20 documents in 6630 ms. Retrieved 20 documents in 6633 ms.
> Retrieved 20 documents in 6637 ms. Retrieved 20 documents in 6639 ms.
> Retrieved 20 documents in 6801 ms. Retrieved 20 documents in 9302 ms.

肝心なのは、これよりもはるかに速い読み取り時間を期待していたということです。私はまだ何か間違ったことをしていると思っています。私が今提供できる他の情報がわからないが、何かが足りない場合は私に知らせてください。

また、役立つことを期待して、テストによって実行されるクエリの1つに関するexplain()トレースも含めています。

{
        "cursor" : "BtreeCursor _id_ multi",
        "nscanned" : 39,
        "nscannedObjects" : 20,
        "n" : 20,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : false,
        "indexOnly" : false,
        "indexBounds" : {
                "_id" : [
                        [
                                3276,
                                3276
                        ],
                        [
                                8257,
                                8257
                        ],
                        [
                                11189,
                                11189
                        ],
                        [
                                21779,
                                21779
                        ],
                        [
                                22293,
                                22293
                        ],
                        [
                                23376,
                                23376
                        ],
                        [
                                28656,
                                28656
                        ],
                        [
                                29557,
                                29557
                        ],
                        [
                                32160,
                                32160
                        ],
                        [
                                34833,
                                34833
                        ],
                        [
                                35922,
                                35922
                        ],
                        [
                                39141,
                                39141
                        ],
                        [
                                49094,
                                49094
                        ],
                        [
                                54554,
                                54554
                        ],
                        [
                                67684,
                                67684
                        ],
                        [
                                76384,
                                76384
                        ],
                        [
                                85612,
                                85612
                        ],
                        [
                                85838,
                                85838
                        ],
                        [
                                91634,
                                91634
                        ],
                        [
                                99891,
                                99891
                        ]
                ]
        }
}

何かアイデアがあれば、私はそれを読むことを最も切望します。前もって感謝します!

マルセル

4

1 に答える 1

2

「in」(GenericModifier)は、_idインデックスを使用する効率をバイパスして、where句をチェックするために各ドキュメントを完全に抽出するシーケンシャルスキャンを強制していると思われます。乱数はかなり分散している可能性があることを考えると、各スレッド/クエリは基本的にデータベース全体をスキャンしていると思います。

いくつか試してみることをお勧めします。(1)個別の単一IDで20個のドキュメントごとに個別にクエリを実行します(2)MongoCursorの使用を検討し、Explainを使用してクエリでのインデックスの使用に関する情報を取得します

祝福、

-ゲイリー

PSスレッド時間は、作業中にいくつかのスレッドスケジューリング効果もあることを示しているようです。

于 2012-04-05T20:34:09.160 に答える