minioのベンチマークを公式ツールなwarpを使って取ってみる。

# 概要
https://qiita.com/tomokitamaki/items/5ef2ef4cc72f5b70e241

上記の記事で作った構成のベンチマークを公式ベンチマークツール？の
warpを使って取得してみる。

# 何でこの記事を書いたのか

warpがさらっと使えて便利だったので、シュッとまとめようと思った。
あんまり記事も無いみたいだし。


# warpってどんなツール？

[公式リポジトリ](https://github.com/minio/warp) に書いてある。
注意事項とかも書いてあるからそっちを読んだほうがいい。

ざっくりまとめるなら、
単に1台のホストからとあるminoに対して負荷をベンチマークテストを実行するだけじゃなくて、
複数台のホストからとあるminioに対して実行したり、
1台のホストもしくは複数台のホストからminio **群**に対してベンチマークテストを実行できて、
ベンチマークテスト同士の結果を比べてくれたりするツール。
DDOSになってしまわないようにしよう。

# 前提

- 構成は以下  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/49f58cdd-f357-f3d3-e342-e63dc5be20cb.png)
- インターネット側は100Mbpsベストエフォート
- HAProxy配下は1Gbpsまで
- 1台のminioに対してと複数のminoで分散した場合のそれぞれ行う。
- 使っているVMは全て1コア1GBメモリの一番小さいやつ
- minioのIPは192.168.5.21 〜 25まで。

# まずはじめに

[warpのイメージのDockerfile](https://github.com/minio/warp/blob/master/Dockerfile)見ているとentrypointに./warpがあるので、docker container run時に色々引数を渡せばいいのだなと分かる。

# インターネット越しにベンチマークテストしてみる

## HAProxyを介すけどバランシングせず、1台のminioに対して実施してみる

HAProxyの設定でバランスしないようにするだけで、warpは関係ない。

```shell
sudo docker run --rm docker.io/minio/warp:latest \
  mixed --host=HAProxyのIP:9000 \
  --access-key=AKIAIOSFODNN7EXAMPLE \
  --secret-key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
  --objects 100 --obj.size 1MiB --autoterm

# 例
sudo docker run --rm docker.io/minio/warp:latest \
  mixed --host=proxy.tmktmk.tmk:9000 \
  --access-key=AKIAIOSFODNN7EXAMPLE \
  --secret-key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
  --objects 100 --obj.size 1MiB --autoterm
```

## HAProxyを介してroundrobinでバランシングして、5台のminioに対して実施してみる

HAProxyの設定でバランスするだけなので、warpは関係ないので前項のコマンドと一緒(ry

# minioに直接ベンチマークテスト実施してみる

前提の図にはないけどSWに繋がるインスタンスを1つ作って、
以下の2パターンで実行しました。

## 1台のminioに対して実行して実行結果をアタッチしたディレクトリに保存する

192.168.5.21 のminioに対して実行するぞ！
`--benchdata` でベンチマークテスト結果を出力する場所を指定できる。
コンテナの `/test_dir/`ってところに `from_inside_node1`ってファイル名で作成する感じ。
拡張子は自動でつく。
ローカルの `/home/ubuntu/result_tank/` は コンテナに `/test_dir` としてアタッチされる。


```shell
sudo docker run -it \
  -v /home/ubuntu/result_tank/:/test_dir \
  docker.io/minio/warp:latest mixed --host=192.168.5.21:9000 \
  --access-key=AKIAIOSFODNN7EXAMPLE \
  --secret-key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
  --objects 1250 --obj.size 10MiB --autoterm \
  --benchdata /test_dir/from_inside_node1
```

## 5台のminioに対して実行して実行結果をアタッチしたディレクトリに保存する

変更点は `--host=192.168.5.21:9000` だった前項の部分を

```shell
--host=192.168.5.2{1...5}:9000
```

に変えるだけ。これで5.21 ~ 25のminioに対してベンチマークテストを実行することになる。
あ、あとファイル名は `from_inside_node1` から

```shell
from_inside_node1to5
```

に変えました。次の項でそれぞれの結果を比較したいのです。

# 実行結果を比較する

引数cmp を使って比較する。
時系列順ではなく指定した順に比較される。(公式の[この辺](https://github.com/minio/warp#comparing-benchmarks)に書いてる。)

以下の場合は、from_inside_node1.csv.zstが前, from_inside_node1to5.csv.zstが後として比較される

```
sudo docker run -it \
  -v /home/ubuntu/result_tank/:/test_dir \
  docker.io/minio/warp:latest \
  cmp /test_dir/from_inside_node1.csv.zst /test_dir/from_inside_node1to5.csv.zst
```

以下の感じで結果が表示される。

```shell
-------------------
Operation: DELETE
Operations: 385 -> 722
Endpoints: 1 -> 5
* Average: +87.90% (+1.1) obj/s
-------------------
Operation: GET
Operations: 1753 -> 3228
Endpoints: 1 -> 5
* Average: +84.67% (+49.2 MiB/s) throughput, +84.67% (+4.9) obj/s
* First Byte: Average: -86.766995ms (-27%), Median: -35.278689ms (-15%), Best: -4.446406ms (-45%), Worst: -355.010915ms (-25%)
-------------------
Operation: PUT
Operations: 587 -> 1076
Endpoints: 1 -> 5
Duration: 4m59s -> 5m0s
* Average: +84.06% (+16.3 MiB/s) throughput, +84.06% (+1.6) obj/s
-------------------
Operation: STAT
Operations: 1164 -> 2145
Endpoints: 1 -> 5
* Average: +84.17% (+3.3) obj/s
```

全体的に分散したほうがパフォーマンスが上がっていることが分かる。(だよね？)

# 終わりに

今回はベンチマークテストの手法をmixedにしたけども、getだけとかputだけとかも出来るし、
以下みたいなwarpを実行するクライアントを増やして協調してベンチマークテストを実行する事もできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/c62cde5b-7ba4-9aec-0732-a2f67e4f203e.png)
(画像は公式のREADMEから抜粋)