工場長のブログ

日々思ったことを書いてます。

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マイクロ秒

という感じの読み方になると思う。

まとめ

負荷パターンの調整などはまた次回ということで一旦まとめる。

  • YCSBはNoSQLのベンチマークツール
  • メジャーなNoSQL(HBaseやMongoDB,Cassandra,DynamoDBなど)はすぐにベンチできる
  • クライアントライブラリが同梱されていないNoSQLでも、自分で実装可能
  • インストールはgithubからソースをダウンロードしてmavenでビルド(ビルド済みのバイナリも配布されている)