为了在CentOS6上testing我的MongoDB 3.2 / WiredTiger,我使用http://vladmihalcea.com/2013/12/01/mongodb-facts-80000-insertssecond-on-commodity-hardware/中的脚本。 这里列出脚本(稍加修改):
// Run me as: // mongo random --eval "var arg1=50000000;arg2=1" create_random.js var minDate = new Date(2012, 0, 1, 0, 0, 0, 0); var maxDate = new Date(2013, 0, 1, 0, 0, 0, 0); var delta = maxDate.getTime() - minDate.getTime(); var job_id = arg2; var documentNumber = arg1; var batchNumber = 5 * 2000; var job_name = 'Job#' + job_id var start = new Date(); var tsPrev = start; var batchDocuments = new Array(); var index = 0; while(index < documentNumber) { var date = new Date(minDate.getTime() + Math.random() * delta); var value = Math.random(); var document = { created_on : date, value : value }; batchDocuments[index % batchNumber] = document; if((index + 1) % batchNumber == 0) { db.randomData.insert(batchDocuments, {writeConcern:{w:0}, ordered: false}); } index++; if(index % 100000 == 0) { var tsNow = new Date(); print(job_name + ' inserted ' + index + ' documents in ' + (tsNow-tsPrev)/1000 + 's; Total time: ' + (tsNow-start)/1000 + 's'); tsPrev = tsNow; } } print(job_name + ' inserted ' + documentNumber + ' in ' + (new Date() - start)/1000.0 + 's');
平均每批文件数量达到11000张,可以独立编写音乐会或者下达标志。 来自mongostats的数据:
insert query update delete getmore command % dirty % used flushes vsize res qr|qw ar|aw netIn netOut conn time 15424 *0 *0 *0 0 1|0 0.5 17.6 0 3.2G 2.8G 0|0 0|1 930k 18k 33 2015-12-15T23:32:40+01:00 12430 *0 *0 *0 0 6|0 0.5 17.6 0 3.2G 2.8G 0|0 0|0 807k 19k 33 2015-12-15T23:32:41+01:00 14330 *0 *0 *0 0 1|0 0.5 17.6 0 3.2G 2.8G 0|0 0|1 868k 18k 33 2015-12-15T23:32:42+01:00 15670 *0 *0 *0 0 1|0 0.5 17.6 0 3.2G 2.8G 0|0 0|0 992k 18k 33 2015-12-15T23:32:43+01:00 10794 *0 *0 *0 0 1|0 0.5 17.6 0 3.2G 2.8G 0|0 0|1 620k 18k 33 2015-12-15T23:32:44+01:00 15370 *0 *0 *0 0 1|0 0.6 17.7 0 3.2G 2.8G 0|0 0|1 992k 18k 33 2015-12-15T23:32:45+01:00 13836 *0 *0 *0 0 6|0 0.6 17.7 0 3.2G 2.8G 0|0 0|0 869k 19k 33 2015-12-15T23:32:46+01:00 13900 *0 *0 *0 0 1|0 0.6 17.7 0 3.2G 2.8G 0|0 0|1 806k 18k 33 2015-12-15T23:32:47+01:00 15121 *0 *0 *0 0 1|0 0.6 17.7 0 3.2G 2.9G 0|0 0|1 992k 18k 33 2015-12-15T23:32:48+01:00 11040 *0 *0 *0 0 1|0 0.6 17.7 0 3.2G 2.9G 0|0 0|1 682k 18k 33 2015-12-15T23:32:49+01:00
脚本本身的数据:
Job#3 inserted 100000 documents in 7.353s; Total time: 7.353s Job#3 inserted 200000 documents in 7.261s; Total time: 14.614s Job#3 inserted 300000 documents in 7.495s; Total time: 22.109s Job#3 inserted 400000 documents in 8.094s; Total time: 30.203s Job#3 inserted 500000 documents in 7.39s; Total time: 37.593s Job#3 inserted 600000 documents in 8.088s; Total time: 45.681s Job#3 inserted 700000 documents in 7.682s; Total time: 53.363s Job#3 inserted 800000 documents in 7.728s; Total time: 61.091s
甚至没有接近80,000 ins / s。
iostats 10给出:
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.40 0.00 2.40 0 24 sdb 34.70 0.00 1801.20 0 18012 avg-cpu: %user %nice %system %iowait %steal %idle 3.72 0.00 0.58 0.03 0.00 95.67 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 26.10 0.40 5464.40 4 54644 sdb 32.50 0.00 1889.60 0 18896
我有32Gb RAM,Intel(R)Xeon(R)CPU E5-2620 0 @ 2.00GHz和SSD 1T IBM ServeRAID M5110e(scsi)。
相对于博客的结果,性能如此之低的原因是什么? 我在哪里可以find更多的基准MongoDB有一个参考点?
在写这篇文章的时候,MongoDB的默认安装被设置为进行不安全的写操作。 这在基准testing中performance很好,但在正确保存数据方面却不是那么好。
https://aphyr.com/posts/284-call-me-maybe-mongodb
直到最近,MongoDB的客户端并不打算检查他们的写入是否成功,默认情况下,他们只是发送它们,并认为一切正常。 这和你所期望的一样。
https://blog.rainforestqa.com/2012-11-05-mongodb-gotchas-and-how-to-avoid-them/
MongoDB默认允许非常快速的写入和更新。 权衡是你没有明确通知失败。 默认情况下,大多数驱动程序会执行asynchronous的“不安全”写操作 – 这意味着驱动程序不会直接返回错误,类似于MySQL的INSERT DELAYED。 如果您想知道是否成功了,则必须使用getLastError手动检查错误。
对于在出现错误时要抛出错误的情况,在大多数驱动程序中启用同步的“安全”查询是很简单的。 这使MongoDB以一种熟悉的方式从更传统的数据库迁移。
你可能会看到更安全的默认设置的结果。