YCSBでNoSQLのベンチマーク その1
ここ数年でNoSQLを実際のシステムで扱うのも割りと一般的になってきていて、機能面だけでなく、性能面が気になるケースが多くなってきたと思う。
じゃあどうやって性能はかるの?比べるの?って話になるよね。
いわゆる、NoSQLにおけるapache benchやJMeterのようなものがほしいよね。
今日は、そのあたりのひとつのソリューションとなるかもな、YCSBというツールについて書いてみる。
YCSBとは
YCSBはYahcoo Cloud Serving Benchmarkの略称で、プロジェクトのWebはこちら。
http://research.yahoo.com/Web_Information_Management/YCSB
https://github.com/brianfrankcooper/YCSB/wiki
ざっくりひとことで役割と説明すると、NoSQL向けのBenchmarkツール。
Javaで実装されていて、こんな感じの構成のアプリケーションになっている。
Workload driver -> DB Access layer -> NoSQL
DB Access layerのところが切りだされているのでここを実装すれば好きなNoSQLで動かすことができるのだが、、現状YCSBに同梱されてくるDB Access layerのライブラリはこんな感じ。メジャーなNoSQLがカバーされてるので、わりとそのまま使えそう。
- cassandra
- DynamoDB
- ElasticSearch (CloudSearchじゃないよw)
- GemFire
- HBase
- Hypertable
- Infinispan
- Mapkeeper
- MongoDB
- Redis
- OrientDB
- Voldemort
インストールしてみる
大まかな流れとしては、githubからコードをダウンロードしてmavenでビルドする感じ。githubのreadmeにビルド済みのバイナリへのリンクがあるが、こちらは割りと最小セットなビルドっぽくて、DynamoDBのクライアントなどは入ってなかったりしたので、ソースをまるごとcloneしてビルドした。あと、ycsbでググると結構むかしのブログが出てきて、そこではantでビルドしてるが、いつかのタイミングからmavenプロジェクトに変わったっぽい。
手順的には以下でOK
$ git clone https://github.com/brianfrankcooper/YCSB.git $ cd YCSB $ mvn clean package
動かしてみる
試しにredisに負荷を掛けてみる。
- 最初にredisの設定を書く。こんな感じ。
$ cat redis.conf redis.host=HOSTNAME or IPADDRESS redis.port=PORTNUMBER
- 負荷をかけてみる。workloadファイルというファイルにいろいろ負荷のパターンなど記述されているが、ひとまずは動かしてみるだけなのであまり気にせずやってみる。結果が標準出力に出るのでリダイレクトしてます。
$ cd YCSB $ ./bin/ycsb run redis workload/workloada > result Loading workload... Starting test. $ cat result YCSB Client 0.1 Command line: -db com.yahoo.ycsb.db.RedisClient -P workloads/workloada -P redis /conf/redis.conf -t [OVERALL], RunTime(ms), 15236.0 [OVERALL], Throughput(ops/sec), 6562.746127592544 [UPDATE], Operations, 49918 [UPDATE], AverageLatency(us), 2241.0442125085137 [UPDATE], MinLatency(us), 2158 [UPDATE], MaxLatency(us), 15749 [UPDATE], 95thPercentileLatency(ms), 2 [UPDATE], 99thPercentileLatency(ms), 2 ==snip==
こんな感じに結果がでた。
大事なのはこのあたりか。
[OVERALL], RunTime(ms), 15236.0 [OVERALL], Throughput(ops/sec), 6562.746127592544 [UPDATE], Operations, 49918 [UPDATE], AverageLatency(us), 2241.0442125085137 [UPDATE], MinLatency(us), 2158 [UPDATE], MaxLatency(us), 15749 [UPDATE], 95thPercentileLatency(ms), 2 [UPDATE], 99thPercentileLatency(ms), 2 [READ], Operations, 50072 [READ], AverageLatency(us), 2280.0942642594664 [READ], MinLatency(us), 2199 [READ], MaxLatency(us), 21950 [READ], 95thPercentileLatency(ms), 2 [READ], 99thPercentileLatency(ms), 2
- 全体のスループット: 6552tps
- 更新クエリの平均レイテンシ: 2242マイクロ秒
- 参照クエリの平均レイテンシ: 2280マイクロ秒
という感じの読み方になると思う。