pg_nosql_benchmark
昨年、PostgreSQL 9.4-betaバージョンの頃から、なんとなくJSONB型を追ってきたわけですが、最近はライバル(?)であるMongoDBとの比較なんかもやってまして、今日はちょっとしたベンチマークで性能を比較してみましたよっと。
pg_nosql_benchmark
このベンチマーク、昨年にEnterpriseDB社がGithub上で公開したベンチマークです。
GitHub - EnterpriseDB/pg_nosql_benchmark: A tool which can be used to benchmark PostgreSQL (JSONB) and MongoDB (BSON)
で、このベンチマーク結果を公開してるわけですが、ホントにそんなに差があるのかと、若干疑問は持っていたわけです。
なので、件数的には小スケールではあるけど、手元にあるVM環境でも、このベンチマークを使って測定してみましたよ。
pg_nosql_benchmarkの概要
- 実は単なるbashスクリプトだよ。
- psqlとmongoシェルを叩くスクリプトだよ。
- シングルタスクで動くベンチマークだよ。
- だからレスポンスは測定できるけど、マルチクライアントからのアクセスによるスループットはこれでは測定できないよ。
- 測定内容
- JSONデータのバルクロード。PostgreSQLならCOPY文、MongoDBならmongoimportを使っているよ。
- JSONデータのINSERT。PostgreSQLならINSERT文、MongoDBなら、db.コレクション名.insert()を使っているよ。
- ロードしたデータの検索。PostgreSQLならSELECT文、MongoDBなら、db.コレクション名.find()を使っているよ。
- update性能やtruncate相当の性能は測定してないよ。
- updateはPostgreSQLの苦手な部分だから、測定しなきゃとは思うけど。
- データサイズも測定しているよ。
- クラスタ構成に関しては、今後の課題みたいだよ。
- MongoDBの場合、クラスタ構成が簡易に簡易に組めるのが売りの一つだと思うので、この測定がMongoDBの能力をフルに発揮出来ているのかというと、ちょい微妙な気もする。
- PostgreSQLの場合、JSONBカラムを一つだけもつテーブルを定義し、JSONBカラムに対してGINインデックスを設定しているみたいだよ。
- ダウンロードしたシェルはそのままでは動作しないよ。
- PostgreSQLやMongoDBへの接続情報は少なくとも修正が必要なはず。
- 文書数は pg_nosql_benchmark シェルスクリプト内の json_rows という変数を修正して変動可能だよ。
- つーか、それくらはパラメータ指定にしてほしかった気が・・・
- MongoDBの場合は、ユーザ追加が必要。手順はドキュメントには書いてあるけど。
測定環境
- 例によって、いつも使っているLet's note上に構築したVMWare+CentOS 7.0。
- ディスクはSSD。
- 測定したバージョン
- PostgreSQL 9.4.0
- MongoDB 2.6.6
- PostgreSQLのチューニングはほとんどしてない。
- shared_buffers, checkpoint_segmentsくらいは変更しても良かったかなー。
- MongoDBのチューニング?何それ?というか、レスポンス測定に効くようなパラメータってあるのかなー?
- VM上のディスク容量にかなり制約がある・・・
今回の測定
- json_rows のパラメータのみを変更
- 文書数は10000, 50000, 100000, 200000, 300000の5パターン。
- ホントは1000000まで測定したかったけど、ディスク容量の制約ががが
- 400000の測定も試したけど、 "no lefrt device" とかwww
測定結果
あくまでも参考値として捉えてください。
- 基本的にどの測定結果も文書数に応じて線形な性能値なので、あまり面白い結果ではない。
所感
- バルクロードとINSERTに関しては、EDBのレポートとそんなに変わりない印象かな。
- SELECTの結果についてはEDBのレポートほど大きな差はついてない。これはCPUスペックの差なのかな・・・?
- 年末に、シンプルな文書モデル(階層なし、配列なし)で測定したときには、INSERT性能にあまり大きな差はなかった。
- つまり、文書の複雑度に応じて、MongoDBのINSERT(推測ではバルクロードも)性能にかなり影響があるのかも・・・。