ども、 西城秀樹の「ヤングマン」がカラオケの 18 番の cloudpackかっぱ (@inokara) です。

はじめに

ベンチマークツールを探していたら Yahoo! 謹製の YCSB(Yahoo! Cloud Serving Benchmark) というツールがあるらしいので導入してみる。ベンチマークツールは導入するだけではダメよダメダメ…だが、今回は Redis(v2.8.19) と Cassandra(v2.0.12) でベンチマークを走らせるまでのメモ。

YCSB とは

Yahoo! Cloud System Benchmark (YCSB)

Yahoo! Cloud System Benchmark プロジェクトの略称。

The goal of the YCSB project is to develop a framework and common set of workloads for evaluating the performance of different “key-value” and “cloud” serving stores.

上記をざっくり意訳すると…

  • YCSB プロジェクトのゴールは異なる KVS やクラウドサービスの性能評価を行う
  • 性能評価の為のフレームワークとワークロードの共通セットを開発すること(重要)

ということなので YCSB を使えば異なる KVS を同じ指標で公平に性能評価が行えると捉えることが出来る(かな)…。

リンク

導入

対象

  • CentOS 6.5

Java 関連パッケージの導入

YCSB は maven でインストールする必要があるので maven を導入、各種パスの設定を行う。

yum install java-1.7.0-openjdk.x86_64
yum install java-1.7.0-openjdk-devel.x86_64
cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz
tar zxvf apache-maven-3.2.5-bin.tar.gz
cp -rfp apache-maven-3.2.5 /usr/local/maven
export PATH=/usr/local/maven/bin:$PATH
readlink $(readlink $(which java)) # java のインストールパスを確認
export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64
maven -version

YCSB の導入

cd /usr/local/src/
git clone https://github.com/brianfrankcooper/YCSB.git
cd YCSB

ちょっと一手間入れる。

diff -u pom.xml.bk pom.xml
--- pom.xml.bk  2015-02-17 10:27:40.296172923 +0000
+++ pom.xml     2015-02-17 10:27:52.731190981 +0000
@@ -49,7 +49,6 @@
     0.7.0
     7.1.0.CR1
     2.1.1
-    1.0
     2.11.2
     1.0.1
     2.0.0
@@ -71,7 +70,6 @@
     
     infinispan
     jdbc
-    mapkeeper
     mongodb
     orientdb
     

mapkeeper のビルドでコケるので無効にする為に pom.xml を修正してビルド。

mvn clean package

しばし待つ。

初めての YCSB

簡単な使い方(ヘルプ)

$ cd YCSB
$ ./bin/ycsb -h
Usage: ./bin/ycsb command database [options]

Commands:
    load          Execute the load phase
    run           Execute the transaction phase
    shell         Interactive mode

Databases:
    accumulo      https://github.com/brianfrankcooper/YCSB/tree/master/accumulo
    basic         https://github.com/brianfrankcooper/YCSB/tree/master/basic
    cassandra-10  https://github.com/brianfrankcooper/YCSB/tree/master/cassandra
    cassandra-7   https://github.com/brianfrankcooper/YCSB/tree/master/cassandra
    cassandra-8   https://github.com/brianfrankcooper/YCSB/tree/master/cassandra
    dynamodb      https://github.com/brianfrankcooper/YCSB/tree/master/dynamodb
    elasticsearch https://github.com/brianfrankcooper/YCSB/tree/master/elasticsearch
    gemfire       https://github.com/brianfrankcooper/YCSB/tree/master/gemfire
    hbase         https://github.com/brianfrankcooper/YCSB/tree/master/hbase
    hypertable    https://github.com/brianfrankcooper/YCSB/tree/master/hypertable
    infinispan    https://github.com/brianfrankcooper/YCSB/tree/master/infinispan
    jdbc          https://github.com/brianfrankcooper/YCSB/tree/master/jdbc
    mapkeeper     https://github.com/brianfrankcooper/YCSB/tree/master/mapkeeper
    mongodb       https://github.com/brianfrankcooper/YCSB/tree/master/mongodb
    nosqldb       https://github.com/brianfrankcooper/YCSB/tree/master/nosqldb
    orientdb      https://github.com/brianfrankcooper/YCSB/tree/master/orientdb
    redis         https://github.com/brianfrankcooper/YCSB/tree/master/redis
    voldemort     https://github.com/brianfrankcooper/YCSB/tree/master/voldemort

Options:
    -P file       Specify workload file
    -p key=value  Override workload property
    -s            Print status to stderr
    -target n     Target ops/sec (default: unthrottled)
    -threads n    Number of client threads (default: 1)

Workload Files:
    There are various predefined workloads under workloads/ directory.
    See https://github.com/brianfrankcooper/YCSB/wiki/Core-Properties
    for the list of workload properties.

./bin/ycsb load でロードテストで利用するデータをロードするフェーズで ./bin/ycsb run で実際のロードテスト実行となる。

以下のように実行する。

./bin/ycsb load redis -s -P workloads/workloada -p "redis.host=127.0.0.1" -p "redis.port=6379"
./bin/ycsb run redis -s -P workloads/workloada -p "redis.host=127.0.0.1" -p "redis.port=6379"

workloads/workloada でどのような負荷を掛けるかを workloada から workloadf から選んでオプションとして指定する。ちなみに workloads 以下は以下のような構成となっている。

$ tree workloads/
workloads/
├── workloada
├── workloadb
├── workloadc
├── workloadd
├── workloade
└── workloadf

0 directories, 6 files

尚、実際に workloada の内容は以下のようになっている。

# load で挿入するレコード数
recordcount=1000
# run で実行されるクエリの回数
operationcount=1000
# workload を実行するクラス
workload=com.yahoo.ycsb.workloads.CoreWorkload
# レコード内の全フィールド読む場合には true(読まない場合には false)
readallfields=true
# 全 operationcount に対する読込の割合
readproportion=0.5
# 全 operationcount に対する更新の割合
updateproportion=0.5
# 全 operationcount に対するスキャンの割合
scanproportion=0
# 全 operationcount に対する挿入の割合
insertproportion=0
# リクエスト分散方式(uniform、zipfian、latest)
requestdistribution=zipfian

上記は「YCSBでNoSQLのベンチマーク その2」を参考にさせて頂いた。とても詳細に纏まっている。有難うございます!

Redis で…

$ cd YCSB
$ ./bin/ycsb load redis -s -P workloads/workloada -p "redis.host=127.0.0.1" -p "redis.port=6379"

実際に Redis にレコードが入っているかを確認。

127.0.0.1:6379> keys *
(snip)
 999) "user8642911275074130716"
1000) "user2644261451985138542"
1001) "user3579785673325141179"
127.0.0.1:6379>

ベンチ実行。

$ ./bin/ycsb run redis -s -P workloads/workloada -p "redis.host=127.0.0.1" -p "redis.port=6379"

Cassandra で…

Cassandra の場合には事前に KEYSPACE を作成する必要があるので作成する。

$ cqlsh
CREATE KEYSPACE usertable WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': '1'
};

USE usertable;

CREATE TABLE data (
  key blob,
  column1 text,
  value blob,
  PRIMARY KEY ((key), column1)
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.100000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.000000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='NONE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

次に load でデータを挿入。

$ ./bin/ycsb load cassandra-10 -P workloads/workloada -p "hosts=127.0.0.1"

念の為にレコード数を確認。

$ cqlsh
Connected to Test Cluster at localhost:9160.
[cqlsh 4.1.1 | Cassandra 2.0.12 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
Use HELP for help.
cqlsh> use usertable ;
cqlsh:usertable> select count(*) from data;

 count
-------
 10000

(1 rows)

Default LIMIT of 10000 was used. Specify your own LIMIT clause to get more results.

cqlsh:usertable>

ベンチを実行。

$ ./bin/ycsb run cassandra-10 -P workloads/workloada -p "hosts=127.0.0.1"

最後に

素晴らしい YCSB(YMCA)

西城秀樹のヤングマンを思い出させる名前の YCSB だが、今回は導入編ということで引続き触っていきたいと思う。

で、Redis と Cassandra のベンチ結果は?

とりあえず以下のような結果となった。(インスタンスサイズは m3.medium でパラメータ等は特に弄っていない)

Redis は…

[OVERALL], RunTime(ms), 1071.0
[OVERALL], Throughput(ops/sec), 933.7068160597572
[UPDATE], Operations, 486
[UPDATE], AverageLatency(us), 424.0246913580247
[UPDATE], MinLatency(us), 115
[UPDATE], MaxLatency(us), 14489
[UPDATE], 95thPercentileLatency(ms), 0
[UPDATE], 99thPercentileLatency(ms), 8
[UPDATE], Return=0, 486

(snip)

[READ], Operations, 514
[READ], AverageLatency(us), 1081.6828793774318
[READ], MinLatency(us), 126
[READ], MaxLatency(us), 52556
[READ], 95thPercentileLatency(ms), 8
[READ], 99thPercentileLatency(ms), 15
[READ], Return=0, 514

Cassandra は…

[OVERALL], RunTime(ms), 2097.0
[OVERALL], Throughput(ops/sec), 476.87172150691464
[UPDATE], Operations, 482
[UPDATE], AverageLatency(us), 1463.4896265560167
[UPDATE], MinLatency(us), 324
[UPDATE], MaxLatency(us), 66460
[UPDATE], 95thPercentileLatency(ms), 9
[UPDATE], 99thPercentileLatency(ms), 18
[UPDATE], Return=0, 482

(snip)

[READ], Operations, 518
[READ], AverageLatency(us), 2190.2162162162163
[READ], MinLatency(us), 503
[READ], MaxLatency(us), 37237
[READ], 95thPercentileLatency(ms), 12
[READ], 99thPercentileLatency(ms), 30
[READ], Return=0, 518

特にパラメータ等を弄っていない為に単純に比較することは出来ないが OVERALLThroughput(ops/sec) だけを比較すると Redis の方が 2 倍程度性能が高いように見える。繰り返しになるが、あくまでもこれは YCSB がどんな結果を出力するのかの参考程度ということで…。

ということで…

引続き YCSB の使い方を覚えていきたい。

元記事はこちらです。
ベンチマークツール YCSB メモ