web-dev-qa-db-ja.com

MongoDB1秒あたり80,000回以上の挿入

CentOS6でMongoDB3.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');

バッチのドキュメント数、コンサートの書き込み、または注文フラグに関係なく、平均11,000回の挿入/秒を取得します。 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インチ/秒にも近くありません。

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)があります。

ブログの結果と比較して、このようなパフォーマンスの低下の理由は何でしょうか。参照ポイントを持つMongoDBのベンチマークはどこにありますか?

1
rlib

その記事が書かれたとき、MongoDBのデフォルトのインストールは安全でない書き込みを行うように設定されていました。これはベンチマークでは優れたパフォーマンスを示しましたが、データを正しく保存するにはそれほど優れていませんでした。

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では、デフォルトで非常に高速な書き込みと更新が可能です。トレードオフは、失敗が明示的に通知されないことです。デフォルトでは、ほとんどのドライバーは非同期の「安全でない」書き込みを行います。これは、MySQLでのINSERT DELAYEDと同様に、ドライバーがエラーを直接返さないことを意味します。何かが成功したかどうかを知りたい場合は、getLastErrorを使用して手動でエラーをチェックする必要があります。

何か問題が発生した場合にエラーをスローする必要がある場合、ほとんどのドライバーでは、同期的な「安全な」クエリを有効にするのは簡単です。これにより、MongoDBは、従来のデータベースから移行するユーザーにとってなじみのある方法で動作します。

より安全なデフォルト設定の結果が表示されている可能性があります。

3
ceejayoz