Couchbaseベンチマークツールpillowfight解説


# はじめに

データベースを運用するに当たって、ベンチマークテストは避けて通れない要素です。
汎用的なものから、データベース固有のものまで、ベンチマークテストを行うための各種のツールが提供されています（ベンチマークツールという呼び方の他、ストレスツール、ワークロードジェネレーター等とも呼ばれます）。

本稿では、Couchbase Serverのオープンソースツールであるpillowfightを紹介します。

## その他のNoSQL用ツール

ちなみに、他のNoSQLについても、それぞれ独自のツールが存在しています。

### MongoDB

[MONGO-PERF](https://github.com/mongodb/mongo-perf)

### Cassandra
[Cassandra Stress](https://cassandra.apache.org/doc/latest/tools/cassandra_stress.html)

# pillowfightの使い方

## インストール

pillowfightは、Couchbase C SDK libcouchbaseの一部として提供されます。

### CentOS/RHEL

```
$ sudo yum check-update
$ sudo yum search libcouchbase
$ sudo yum install libcouchbase3 libcouchbase-devel libcouchbase3-tools libcouchbase3-libevent
```

### Mac
```shell
$ brew update
$ brew install libcouchbase
```

### Windows
[SDKリリースノート](https://docs.couchbase.com/c-sdk/current/project-docs/sdk-release-notes.html#install-windows)から、バイナリをダウンロード・解凍して利用します。

その他のOSについても[ドキュメント](https://docs.couchbase.com/c-sdk/current/project-docs/sdk-release-notes.html)を参照してください。

## オプション解説

|省略|非省略|説明|
|:--|:--------------|:--|
|-B|--batch-size|バッチ処理の数 [デフォルト=100]|
|-I|--num-items|アイテムの数 [デフォルト=1000]
|-p|--key-prefix|キー接頭辞の指定 [デフォルト=' ' ] |
| -t|--num-threads|スレッドの数 [デフォルト=1]|
| -R|--random-body|ドキュメント本文をランダム化する [デフォルト=FALSE]|
|-r|--set-pct|ミューテーション操作の割合 [デフォルト= 33]|
|-n|--no-population|ポピュレーション（入力）をスキップする [デフォルト= FALSE]|
|-m|--min-size|最小ペイロードサイズ [デフォルト= 50]|
|-M|--max-size|最大ペイロードサイズ [デフォルト= 5120]|
|-E|--pause-at-end|実行の終了時に一時停止する（ユーザー入力まで接続を保持する) [デフォルト= FALSE]|
|-c|--num-cycles|終了するまで実行されるサイクル数。-1に設定すると、無限にループする [デフォルト= -1 ] |
||--sequential|（ランダムアクセスでなく）シーケンシャルアクセスを使用 [デフォルト= FALSE]|
||--start-at|シーケンシャルアクセスの場合に、最初の値を設定[デフォルト= 0]|
||--rate-limit|1秒あたり操作の制限を設定(スレッド単位） [デフォルト= 0]|
||--docs|ロードするユーザードキュメント（--min-s-izeと--max-sizeをオーバーライド）[デフォルト=] |
|-J|--json|(bytesではなく）JSONデータの書き込みを有効にする [デフォルト= FALSE]|
||--subdoc| fulldoc操作の代わりにsubdoc操作を使用[デフォルト= FALSE]|
||--noop|ドキュメント操作の代わりにNOOPを使用[デフォルト= FALSE]|
||--pathcount|コマンドあたりのサブドキュメントパスの数[デフォルト= 1]
||--populate-only|ドキュメントのポピュレーション（入力）のみを実施し、終了する[デフォルト= FALSE]|
|-e|--expiry|アイテムのTTLを設定 [デフォルト= 0]|
||--collection|コレクションの（スコープを含む）フルパス （複数指定可能） [デフォルト=] |
|-d|--durability| 耐久レベル [デフォルト='none'] 
||--persist-to|アイテムを指定した数のノードに永続化するまでブロックする （-1の場合、マスター+レプリカ） [デフォルト= 0]|
||--replicate-to|アイテムを指定した数のノードに複製されるまでブロックする （-1の場合、すべてのレプリカ） [デフォルト= 0]|
||--lock|更新用ロックキーへ時間設定 （ゼロの場合、ロックされない） [デフォルト= 0]
|-Z|--config-cache|キャッシュ設定へのパス[デフォルト= '' ] |
|-？ |--help|ヘルプメッセージを表示する|

### 共通オプション
以下のオプションは、クラスターへの接続に関連する、`libcouchbase`コマンドの共通オプションです。

|省略|非省略|説明|
|:--|:--------------|:--|
|-U|--spec|接続文字列 [デフォルト='couchbase：//localhost/default' ] |
|-u|--username|ユーザー名 [デフォルト= '' ] |
|-P|--password|バケットパスワード [デフォルト= '' ]| 
|-T|--timings|実行終了時にコマンドタイミングをダンプします。これにより、実行されたコマンドの待ち時間を示すヒストグラムが表示されます。 (詳細：[cbstats timings](https://docs.couchbase.com/server/current/cli/cbstats/cbstats-timing.html))[デフォルト= FALSE]|
|-v|--verbose|デバッグ出力を有効にする [デフォルト= FALSE]|
|-D|--cparam|接続のための追加のオプション(`<OPTION>=<VALUE>`の書式で指定)。例えば、KV操作タイムアウトには`-D-timeout=<SECONDS>`を使用する[デフォルト=]|
|-y|--compress|送信データの圧縮をオンにします（ sec-OND時刻力圧縮） [デフォルト= FALSE]|
||--truststorepath|[デフォルト= '' ] |
||--certpath|サーバーSSL証明書へのパス[デフォルト= '' ] |
||--keypath|クライアントSSL秘密鍵へのパス[デフォルト= '' ] |
||--dump|操作完了後に詳細な内部状態をダンプする [Default = FALSE]|







### ベンチマーク実行例



20スレッドで実行。１スレッド当たり１バッチ処理実行。

```shell
$ cbc-pillowfight -t 20 -B 1
```

50アイテムのデータセットを使って、１００回のイテレーションを行う。

```shell
$ cbc-pillowfight -c 100 -I 50
```

サイズ100kのJSONドキュメントを利用。

```shell
$ cbc-pillowfight --json -m 100000 -M 100000
```
サブドキュメント操作によるストレステスト。

```shell
$ cbc-pillowfight --json --subdoc --set-pct 100
```

接続先、アカウントの指定。JSONドキュメントを、10秒後に期限切れにする。

```shell
$ cbc-pillowfight -U couchbase://localhost/pillow -u Administrator -P password --json -e 10
```


# 参考情報

[Performance Testing and Load Testing Couchbase with Pillowfight](https://blog.couchbase.com/performance-testing-load-testing-couchbase-pillowfight/)

[Couchbase公式ドキュメント C SDK](https://docs.couchbase.com/c-sdk/current/project-docs/sdk-release-notes.html)

[Couchbase C Client 2.6.2](https://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/md_doc_cbc-pillowfight.html)


[A Workload Generator for Couchbase in OpenShift](https://dzone.com/articles/a-workload-generator-for-couchbase-in-openshift)