1台のサーバでSwiftStackのssbenchを動かすまでの覚書

# はじめに
OpenStack Swiftのベンチマークを取るためにSwiftStackが開発しているssbenchというベンチマークツールを構築してみた。使用したOSはUbuntu 14.04.3である。当然だが、ssbenchを構築したサーバとは別途OpenStack Swiftそのものを構築しておく必要がある。

OpenStack Swiftの簡易的な構築手順については以下のとおりである。

[OpenStack Swift(Kilo Release)を構築してみた](http://qiita.com/kentarosasaki/items/a3cfcf5cd77e728b4ee0)

## ssbenchインストール
以下のコマンドで構築できる。各々の環境で外部との間にproxyがある場合には、`pip`実行時に、`--proxy=`をつけるとうまくいく。

```shell-session
$ sudo apt-get update
$ sudo apt-get install -y python-dev python-pip 'g++' libzmq-dev
$ sudo pip install pip --upgrade --proxy="http://<myproxy>:<myport>"
$ sudo pip install ssbench --allow-external statlib --allow-unverified statlib --proxy="http://<myproxy>:<myport>"
```

## シナリオ作成
ベンチマークを実行するためには、事前にシナリオを作成して、そのシナリオに沿って実行することになる。以下のシナリオは、ssbenchのGitHubのREADME.mdに記載されているサンプルのシナリオである。各項目の説明もREADME.mdに記載されている。`crud_profile`という項目が、CREATE、READ、UPDATE、DELETEの各メソッドの割合である。ここを調整すれば書き込みだけのベンチマークを作ることも可能である。

```text:very_small.scenario
{
  "name": "Small test scenario",
  "sizes": [{
    "name": "tiny",
    "size_min": 4096,
    "size_max": 65536
  }, {
    "name": "small",
    "size_min": 100000,
    "size_max": 200000
  }],
  "initial_files": {
    "tiny": 100,
    "small": 10
  },
  "operation_count": 500,
  "crud_profile": [3, 4, 2, 2],
  "user_count": 7
}
```

## ベンチマーク実行
ベンチマーク用サーバが1台のみの場合、workerを事前に立ち上げておく必要はないため、以下のコマンドで実行できる。`--worker`オプションでworker数を決定する。注意点として、ssbenchは、Keystone v3にまだ対応していないため、認証のための環境変数は、v2を利用する必要がある。

```shell-session
$ export OS_TENANT_NAME=demo
$ export OS_USERNAME=demo
$ export OS_PASSWORD=demo
$ export OS_AUTH_URL=http://192.168.0.13:5000/v2.0
$ swift stat
                        Account: AUTH_25e9c03ea9824a6e8d24a60ac5e72c98
                     Containers: 0
                        Objects: 0
                          Bytes: 0
Containers in policy "policy-0": 0
   Objects in policy "policy-0": 0
     Bytes in policy "policy-0": 0
    X-Account-Project-Domain-Id: default
                     Connection: keep-alive
                    X-Timestamp: 1441783575.55310
                     X-Trans-Id: tx2260ad3b3ed840f99d075-0056091154
                   Content-Type: text/plain; charset=utf-8
                  Accept-Ranges: bytes
```

```shell-session
$ ssbench-master run-scenario -f scenarios/very_small.scenario -u 4 -c 80 -o 613 --pctile 50 --workers 2
```

ベンチマークが完了すると、以下のとおりObjectsの値が増えていることが確認できる。

```shell-session
$ swift stat
                        Account: AUTH_25e9c03ea9824a6e8d24a60ac5e72c98
                     Containers: 81
                        Objects: 39
                          Bytes: 1423364
Containers in policy "policy-0": 81
   Objects in policy "policy-0": 39
     Bytes in policy "policy-0": 1423364
    X-Account-Project-Domain-Id: default
                     Connection: keep-alive
                    X-Timestamp: 1441783575.55310
                     X-Trans-Id: tx2260ad3b3ed840f99d075-0056091154
                   Content-Type: text/plain; charset=utf-8
                  Accept-Ranges: bytes
```

## レポート
デフォルトでは、以下のとおり、標準出力にレポートが出力される。

```shell-session
$ ssbench-master run-scenario -f scenarios/very_small.scenario -u 4 -c 80 -o 613 --pctile 50 --workers 2
INFO:SwiftStack Benchmark (ssbench version 0.3.6)
INFO:Spawning local ssbench-worker (logging to /tmp/ssbench-worker-local-0.log) with ssbench-worker --zmq-host 127.0.0.1 --zmq-work-port 13579 --zmq-results-port 13580 --concurrency 2 --batch-size 1 0
INFO:Spawning local ssbench-worker (logging to /tmp/ssbench-worker-local-1.log) with ssbench-worker --zmq-host 127.0.0.1 --zmq-work-port 13579 --zmq-results-port 13580 --concurrency 2 --batch-size 1 1
INFO:Starting scenario run for "Small test scenario"
INFO:Starting new HTTP connection (1): 192.168.0.13
INFO:Ensuring 80 containers (ssbench_*) exist; concurrency=10...
INFO:Initializing cluster with stock data (up to 4 concurrent workers)
INFO:Starting benchmark run (up to 4 concurrent workers)
Benchmark Run:
  X    work job raised an exception
  .  <  1s first-byte-latency
  o  <  3s first-byte-latency
  O  < 10s first-byte-latency
  * >= 10s first-byte-latency
  _  <  1s last-byte-latency  (CREATE or UPDATE)
  |  <  3s last-byte-latency  (CREATE or UPDATE)
  ^  < 10s last-byte-latency  (CREATE or UPDATE)
  @ >= 10s last-byte-latency  (CREATE or UPDATE)
.____________..__..._._____.___._...___....._..______.__.___....__.___._______..___..___.__.___..__..__.___..______.___.._____._._._.__..__.__________.___..._.______._..___._...__..__..___..._______._....
._______..____.___._...__.__.________...___.___..___..._.___......_.__._._.___._..._.________.._.___.._.____._.___.___._..___.__.________..._.___.__._..._...____.____________.._..____.___..____.___....__.
______._.___....._.._.___.____.___...______._.____.__.____..__...__....__._____.____._.._.___.._.___.____.._.__....__..._..__.._..___...______..._____.________._.___..__..______._.__.____._.._._.___.___..
_
INFO:Deleting population objects from cluster
INFO:Calculating statistics...
[23/4042]

Small test scenario  (generated with ssbench version 0.3.6)
Worker count:   2   Concurrency:   4  Ran 2015-09-28 09:01:12 UTC to 2015-09-28 09:01:15 UTC (2s)
Object expiration (X-Delete-After): None (sec)

% Ops    C   R   U   D       Size Range       Size Name
91%   % 27  36  18  18        4 kB -  66 kB  tiny
9%   % 27  36  18  18      100 kB - 200 kB  small
---------------------------------------------------------------------
27  36  18  18      CRUD weighted average

TOTAL
Count:   613 (    0 error;     0 retries:  0.00%)  Average requests per second: 275.5
min       max      avg      std_dev  50%-ile                   Worst latency TX ID
First-byte latency:  0.004 -   0.033    0.007  (  0.003)    0.007  (all obj sizes)  txa4bc993d43b84f0e85e68-00560901da
Last-byte  latency:  0.004 -   0.034    0.013  (  0.005)    0.013  (all obj sizes)  tx2d34ee8c4d6d4189b8ea8-00560901da
First-byte latency:  0.004 -   0.033    0.007  (  0.003)    0.007  (    tiny objs)  txa4bc993d43b84f0e85e68-00560901da
Last-byte  latency:  0.004 -   0.034    0.013  (  0.005)    0.013  (    tiny objs)  tx2d34ee8c4d6d4189b8ea8-00560901da
First-byte latency:  0.005 -   0.013    0.008  (  0.002)    0.008  (   small objs)  txe0adce80c104457b9d691-00560901db
Last-byte  latency:  0.006 -   0.024    0.014  (  0.005)    0.014  (   small objs)  txd660615e53b043608533a-00560901db

CREATE
Count:   156 (    0 error;     0 retries:  0.00%)  Average requests per second:  70.7
min       max      avg      std_dev  50%-ile                   Worst latency TX ID
First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (all obj sizes)
Last-byte  latency:  0.010 -   0.034    0.018  (  0.004)    0.017  (all obj sizes)  tx2d34ee8c4d6d4189b8ea8-00560901da
First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (    tiny objs)
Last-byte  latency:  0.010 -   0.034    0.018  (  0.004)    0.017  (    tiny objs)  tx2d34ee8c4d6d4189b8ea8-00560901da
First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (   small objs)
Last-byte  latency:  0.013 -   0.023    0.019  (  0.003)    0.019  (   small objs)  txcc1f72421c8642569669f-00560901db

READ
Count:   227 (    0 error;     0 retries:  0.00%)  Average requests per second: 102.5
min       max      avg      std_dev  50%-ile                   Worst latency TX ID
First-byte latency:  0.004 -   0.033    0.007  (  0.003)    0.007  (all obj sizes)  txa4bc993d43b84f0e85e68-00560901da
Last-byte  latency:  0.004 -   0.034    0.007  (  0.003)    0.007  (all obj sizes)  txa4bc993d43b84f0e85e68-00560901da
First-byte latency:  0.004 -   0.033    0.007  (  0.003)    0.007  (    tiny objs)  txa4bc993d43b84f0e85e68-00560901da
Last-byte  latency:  0.004 -   0.034    0.007  (  0.003)    0.007  (    tiny objs)  txa4bc993d43b84f0e85e68-00560901da
First-byte latency:  0.005 -   0.013    0.008  (  0.002)    0.008  (   small objs)  txe0adce80c104457b9d691-00560901db
Last-byte  latency:  0.006 -   0.014    0.009  (  0.002)    0.010  (   small objs)  txe0adce80c104457b9d691-00560901db

UPDATE
       Count:   112 (    0 error;     0 retries:  0.00%)  Average requests per second:  50.8
                            min       max      avg      std_dev  50%-ile                   Worst latency TX ID
       First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (all obj sizes)
       Last-byte  latency:  0.011 -   0.025    0.017  (  0.003)    0.017  (all obj sizes)  txd1fb3de9a4ea4a308e498-00560901da
       First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (    tiny objs)
       Last-byte  latency:  0.011 -   0.025    0.017  (  0.003)    0.017  (    tiny objs)  txd1fb3de9a4ea4a308e498-00560901da
       First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (   small objs)
       Last-byte  latency:  0.012 -   0.024    0.019  (  0.004)    0.019  (   small objs)  txd660615e53b043608533a-00560901db

DELETE
       Count:   118 (    0 error;     0 retries:  0.00%)  Average requests per second:  53.5
                            min       max      avg      std_dev  50%-ile                   Worst latency TX ID
       First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (all obj sizes)
       Last-byte  latency:  0.008 -   0.021    0.013  (  0.003)    0.013  (all obj sizes)  tx9e4fcece93f246978ddb3-00560901da
       First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (    tiny objs)
       Last-byte  latency:  0.008 -   0.021    0.013  (  0.003)    0.013  (    tiny objs)  tx9e4fcece93f246978ddb3-00560901da
       First-byte latency:  N/A   -   N/A      N/A    (  N/A  )    N/A    (   small objs)
       Last-byte  latency:  0.011 -   0.019    0.014  (  0.002)    0.014  (   small objs)  tx69c6d811c4144804ade27-00560901db

Distribution of requests per worker-ID: 306.000 - 307.000 (avg: 306.500; stddev:   0.500)
INFO:Scenario run results saved to /tmp/ssbench-results/Small_test_scenario.u4.o613.r-.2015-09-28.090109.stat.gz
INFO:You may generate a report with:
  /usr/local/bin/ssbench-master report-scenario -s /tmp/ssbench-results/Small_test_scenario.u4.o613.r-.2015-09-28.090109.stat.gz
```

標準出力にある通り、以下のコマンドでファイルに出力可能である。

```shell-session
$ /usr/local/bin/ssbench-master report-scenario -s /tmp/ssbench-results/Small_test_scenario.u4.o613.r-.2015-09-28.090109.stat.gz
```

その他、`--csv`オプションを付ければ、代わりにcsvファイルが出力される。

これで、ひとまず基本的なベンチマークができるようになる。