0

Rails アプリケーションを 2 回セットアップしました。1 つは MongoDB (マッパーとして Mongoid) を使用し、もう 1 つは MySQL と ActiveRecord を使用しています。次に、両方のデータベース (100.000 エントリ) にいくつかのテスト データを挿入する rake タスクを作成しました。Ruby Benchmark モジュールを使用して、各データベースにかかる時間を測定しました。mongodb が常に mysql よりも高速 (約 1/3) であった 100 および 10.000 エントリでいくつかのテストを行いました。奇妙なことに、mongodb では 100.000 エントリを挿入するのに mysql よりも約 3 倍の時間がかかります。なぜmongodbがこの動作をするのかわかりません?! 私が知っている唯一のことは、CPU時間が合計時間よりもはるかに低いということです. データの挿入中にmongodbが何らかのガベージコレクションを開始する可能性はありますか? 最初は速いですが、mongodbが挿入するデータが増えるにつれて、どんどん遅くなります...

2 つのデータベースの読み取りパフォーマンスを何とか取得するために、データベースが検索クエリを取得して結果を応答するまでの時間を測定することを考えました。正確な測定が必要なので、Rails がコントローラーからデータベースへのクエリを処理している時間を含めたくありません。

Railsコントローラーではなく、データベースで直接測定するにはどうすればよいですか? 私を助ける宝石/ツールはありますか?

前もって感謝します!

編集:現在の状況に応じて質問を更新しました

4

2 に答える 2

1

基本的な目標が DB レベルでデータベースのパフォーマンス時間を測定することである場合は、MongoDB のbenchRunメソッドに慣れることをお勧めします。

やりたいことを実行するには、リンクされたページの例から始めることができます。ここに説明付きの変形があります:

// skipped dropping the table and reinitializing as I'm assuming you have your test dataset
// your database is called test and collection is foo in this code
ops = [
// this sets up an array of operations benchRun will run
   { 
      // possible operations include find (added in 2.1), findOne, update, insert, delete, etc.
      op : "find" ,   
      // your db.collection
      ns : "test.foo" ,  
      // different operations have different query options - this matches based on _id
      // using a random value between 0 and 100 each time
      query : { _id : { "#RAND_INT" : [ 0 , 100 ] } }
   }
]

for ( x = 1; x<=128; x*=2){
    // actual call to benchRun, each time using different number of threads
    res = benchRun( { parallel : x ,   // number of threads to run in parallel
                      seconds : 5 ,    // duration of run; can be fractional seconds
                      ops : ops        // array of operations to run (see above)
                    } )
    // res is a json object returned, easiest way to see everything in it:
    printjson( res )
    print( "threads: " + x + "\t queries/sec: " + res.query )
}

これを testing.js というファイルに入れると、次のように mongo シェルから実行できます。

> load("testing.js")
{
    "note" : "values per second",
    "errCount" : NumberLong(0),
    "trapped" : "error: not implemented",
    "queryLatencyAverageMs" : 69.3567923734754,
    "insert" : 0,
    "query" : 12839.4,
    "update" : 0,
    "delete" : 0,
    "getmore" : 0,
    "command" : 128.4
}
threads: 1   queries/sec: 12839.4

等々。

于 2012-05-07T00:13:53.443 に答える
0

多くのドキュメントを挿入すると MongoDB が遅くなる理由がわかりました。

#build または #create を呼び出すと、ガベージ コレクターが実行時間の 90% 以上を占めるため、MRI を使用する場合、10,000 を超えるドキュメントに対して多対多の関係を使用することはお勧めしません。これは、これらの操作で発生する大きな配列の追加が原因です。 http://mongoid.org/performance.html

次に、各データベースのクエリ パフォーマンスを測定する方法を知りたいと思います。私の主な関心事は、クエリ時間とフロー容量/スループットの測定です。この測定はデータベースで直接行う必要があるため、結果が損なわれることはありません。

于 2012-05-03T14:09:57.767 に答える