ひとりでやるRiak Advent Calendar 2012 day12 - basho_bench

J-Tourism: Can you feel my heart?

「Riak気になるんだけど、速いの?!」という方に残念なお知らせです。Riakはそんなに目立って速いわけじゃないです。速いのがいいという方はKyoto Tycoonやmemcachedを使ってください。マイクロベンチマークで速度を稼いでも自分のユースケースに合ってなければプロダクションで性能は出ないしやりたいことが達成できるかどうかも分からない。
なので、「自分のユースケース」でベンチマークが書けるツールをご紹介。その名もbasho_benchだ。basho_benchというとぼくの同僚となった板わさ先生が書いた記事が有名だが、その後さらに便利になったので一旦解説しておきたい。

定番Riakのインストール

復習。今日知ったのだけどもstageというのがある。Erlang R15B01がサポートされているが、まあR15B03-1でも動く。

$ git clone git://github.com/basho/riak
$ cd riak && make stage
$ ulimit -n 4096
$ cd rel/riak && bin/riak start
$ bin/riak attach

attachしておくのは、何かあったらそこにログっぽくエラーが表示されるから。別に表示しなくてもよい。

basho_benchビルド

$ git clone git://github.com/basho/basho_bench
$ cd basho_bench && make

簡単すぎる。

測定

$ ./basho_bench examples/riakc_pb.config

これは、RiakのPBクライアントでデータを測定する。他にもさまざまなbasho_bench_driverがあるので、適宜examples/*.configをみてもらいたい。

結果をみる

さてここからが以前と違うところだ。以前はグラフを画像にするためだけにRをインストールして依存ライブラリを解決してやる必要があり、しかも、サーバー側で作業していると作成した画像をローカルに持ってこないと表示できないなんてことがあった。しかし、@itawasa先生の尽力によりgnuplotでも描画できるようになっている。なので

$ sudo port install gnuplot

などとしてgnuplotをつかえる状況にしておいてから、

$ priv/gp_throughput.sh

としてみよう。Macだとグラフがパッと表示されたはずだ。すばらしい。しかしこれだけじゃない。

priv/gp_throughput.sh -t dumb

とすると、なんとコンソール上にグラフが表示されるのだ!!!これはすごい!!

                               Throughput [ops/sec]

  1000 ++--------+--------+---------+---------+---------+--------+--------++
       +A        +        +         +         +         +        +         +
   900 ++A................................................................++
   800 ++*................................................................++
       | *       :        :         :         :         :        :         |
   700 ++.*..AA..A.AAAAA......A...........................................++
       |  * A  AA:A     * :AA *AAAA A AAA AA  :         :     AAAA         |
   600 ++.A.*...........A..*.A.....**A...A..AAA.A.AAAAAAAAAAAA...A........++
   500 ++..A.............AA........A...........A.A........................++
       |         :        :         :         :         :        :         |
   400 ++.................................................................++
       |         :        :         :         :         :        :         |
   300 ++.................................................................++
       |         :        :         :         :         :        :         |
   200 ++.....................................................total.**A***++
   100 ++....................................................failed ##B###++
       +         +        +         +         +         +        +         +
     0 +BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB--------++
       0        100      200       300       400       500      600       700
                                   Elapsed [sec]

これでわざわざ面倒なことをしなくても簡単に大体のスループットやレイテンシを測定できるようになる。

ちなみにhttpの性能を測りたいときは

$ ./basho_bench examples/httpraw.config 

で、測定結果は

                              Throughput [ops/sec]

  500 ++----------+----------+-----------+----------+----------+----------++
      A********   +          +           +          +          +           +
  450 ++.......***....................***A**********......................++
  400 ++..........A**********...******..............A***********AA........++
      |           :          A**         :          :          :           |
  350 ++..................................................................++
      |           :          :           :          :          :           |
  300 ++..................................................................++
  250 ++..................................................................++
      |           :          :           :          :          :           |
  200 ++..................................................................++
      |           :          :           :          :          :           |
  150 ++..................................................................++
      |           :          :           :          :          :           |
  100 ++......................................................total.**A***++
   50 ++.....................................................failed ##B###++
      +           +          +           +          +          +           +
    0 B###########B##########B###########B##########B###########BB--------++
      10          20         30          40         50         60          70
                                  Elapsed [sec]

というわけで、PBの方がざっくり1.5倍くらい速いことが分かる。

他の使い方を知りたい場合は、*.configに大抵の設定値があり、その実装は src/basho_bench_driver_foobar.erl に書かれているのでそれを見るとよい。exampleにあるこのふたつを読めばなんとなく使い方は分かると思う。分からない場合は、Erlangの勉強から始めよう!!!