ども、 西城秀樹の「ヤングマン」がカラオケの 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 を同じ指標で公平に性能評価が行えると捉えることが出来る(かな)…。
リンク
- brianfrankcooper/YCSB
- OpenJDKをyumインストールした場合のJAVA_HOMEの設定の仕方
- YCSBでNoSQLのベンチマーク
- Cassandraを用いた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
特にパラメータ等を弄っていない為に単純に比較することは出来ないが OVERALL
の Throughput(ops/sec)
だけを比較すると Redis の方が 2 倍程度性能が高いように見える。繰り返しになるが、あくまでもこれは YCSB がどんな結果を出力するのかの参考程度ということで…。
ということで…
引続き YCSB の使い方を覚えていきたい。
元記事はこちらです。
「ベンチマークツール YCSB メモ」