0

我设置了我的 Rails 应用程序两次。一种是使用 MongoDB(Mongoid 作为映射器),另一种是使用 MySQL 和 ActiveRecord。然后我写了一个 rake 任务,将一些测试数据插入两个数据库(100.000 个条目)。我用 ruby​​ Benchmark 模块测量了每个数据库需要多长时间。我对 100 和 10.000 个条目进行了一些测试,其中 mongodb 总是比 mysql 快(大约 1/3)。奇怪的是,在 mongodb 中插入 100.000 个条目所需的时间大约是 mysql 的 3 倍。我不知道为什么 mongodb 有这种行为?!我唯一知道的是cpu时间远低于总时间。mongodb 是否有可能在插入数据时开始某种垃圾收集?一开始它很快,但是随着mongodb插入的数据越来越多,它变得越来越慢......

为了以某种方式获得两个数据库的读取性能,我考虑测量数据库获取搜索查询并响应结果的时间。由于我需要一些精确的测量,我不想包括 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 shell 运行它:

> 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 在插入许多文档时变慢的原因。

在使用 MRI 时,不建议对超过 10,000 个文档使用多对多关系,因为在调用 #build 或 #create 时垃圾收集器会占用超过 90% 的运行时间。这是由于在这些操作中发生的大数组附加。 http://mongoid.org/performance.html

现在我想知道如何衡量每个数据库的查询性能。我主要关心的是查询时间和流量/吞吐量的测量。这种测量应该直接在数据库中进行,这样任何东西都不会掺杂结果。

于 2012-05-03T14:09:57.767 回答