Tendermint ベンチマーク

#はじめに

このベンチマークはあくまでどの程度コンセンサスに時間がかかり、マシーン数を増やすとどの程度遅延が発生するかを定量的に知るために行なっています。また、スペックにも気を使っていません。。

# TendermintのTPS検証
Tendermintでの処理スピードについて実際に調べてみる。TPSとは、一秒間あたりの秒間トランザクションを意味し、実際の決済やゲームでは一定水準以上のスピードが求められます．

TPSについては，詳しくは，以下のスライドが参考になります．

https://speakerdeck.com/r_etx/tps-and-51-percent-attack
![スクリーンショット 2018-07-30 13.34.07.png](https://qiita-image-store.s3.amazonaws.com/0/206272/9162bcc1-0ab3-5c61-c99a-9d92836a07ed.png)


今回は、Tendermitのベンチマークツール、[tm-bench](https://github.com/tendermint/tools/tree/master/tm-bench)を用いました。

動作環境
Mac上のVirtual Boxにて、
- メインメモリー　512MB
- プロセッサー数 1CPU
- Linux/Ubuntu (64bit)
の環境下で、
version 0.22.4-c64a3c74のTendermitを用いて、local networkでベンチマークを
行いました。

以下その結果を引用します。

### 測定方法
10秒間数千トランザクションを発生させた時に処理できるトランザクションの数を測定した。今回は、テストなので簡単なkey-value-storeのトランザクションを利用しています。

### 注意点
TPSの値は、使用するPCや動作環境によって大きく異なるので、今回のbenchmarkは、一つの目安に過ぎないです。
公式が行なっているベンチマークはこちらを参考にしてください。
https://github.com/tendermint/tendermint/wiki/Benchmarks


## Ubuntu machine 1台で

```
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        594       352        876     5936      
Blocks/sec     0.900     0.300      1       9         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 2000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        577       355        874     6342      
Blocks/sec     0.818     0.386      1       9         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 3000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        607       343        859     6682      
Blocks/sec     0.909     0.287      1       10        
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 5000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        586       349        893     6443      
Blocks/sec     0.909     0.287      1       10        
```

## Ubuntu machine 2台で


```
Stats          Avg       StdDev     Max      Total     
Txs/sec        150       405        1360     1504      
Blocks/sec     0.200     0.400      1        2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1500 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        43        130        433     433       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1500 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        0         0          0       0         
Blocks/sec     0.000     0.000      0       0         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1500 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        51        154        513     513       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1200 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        40        119        396     396       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        45        136        452     452       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max      Total     
Txs/sec        100       302        1005     1005      
Blocks/sec     0.200     0.400      1        2         
```

## Ubuntu machine 3台で

```
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657<img title='chart.jpeg' src='/attachments/19e5ae3f-d5c2-4e48-990b-042269f7b8e8' width="1200" data-meta='{"width":1200,"height":800}'>
Stats          Avg       StdDev     Max     Total     
Txs/sec        34        104        345     345       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        89        267        889     889       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 2000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        28        83         276     276       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        36        107        358     358       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        38        115        383     383       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1500 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        54        161        537     537       
Blocks/sec     0.200     0.400      1       2      
 
Stats          Avg       StdDev     Max     Total     
Txs/sec        33        99         331     331       
Blocks/sec     0.200     0.400      1       2       
```

## Ubuntu machine 4台で

```
Stats          Avg       StdDev     Max     Total     
Txs/sec        34        104        345     345       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        89        267        889     889       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        36        107        358     358       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        38        115        383     383       
Blocks/sec     0.200     0.400      1       2              
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        64        181        607     641       
Blocks/sec     0.200     0.400      1       2         
root@vagrant-ubuntu-trusty-64:~# tm-bench -T 10 -r 1000 localhost:26657
Stats          Avg       StdDev     Max     Total     
Txs/sec        70        170        564     700       
Blocks/sec     0.200     0.400      1       2         

```

これらをわかりやすく図示すると、以下のようになります。
ただし、ここでは簡単にTPSの最高値を用いてグラフを作成しました。本当は、丁寧にやるべきところですがざっくりと振る舞いを見るために、このような荒いことを行なっています。

![chart.jpeg](https://qiita-image-store.s3.amazonaws.com/0/206272/79a7fe2d-52b3-0eeb-5804-b28b0058f2cd.jpeg)


このグラフを見ると、TPSはノードの数が増えるごとに指数函数的に減少することがわかります。



# 考察

ノードの数を一台から2台に増やす時にガクッとTPSがさがっている。これは、ノードが1台とのときよりもブロックの伝搬とコンセンサスによる時間が格段と増えるためであると考えます。

また、ノードの数を3台から4台に変化た際にTPSがあまり変化しなかったのは、
Tendermintのアルゴリズムが、3分の1未満のビザンチン障害であれば正常に動くためです。3台のノードの場合、3分の1未満したがって、1台のノードもビザンチン故障できないことになる、つまり3台でコンセンサスが必要です。一方、
4台の場合は、3分の1未満したがって、1.44台未満のビザンチン故障を許容し、3台のノードでコンセンサスをとればブロックが承認されます。そのため、3台のときと4台のときのTPSにあまり違いが起きなかったと推測できます。

# ちなみに
MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)の環境下では以下のような数字が出ました。参考までに。
## Mac Book Pro


```
Stats          Avg       StdDev     Max      Total     
Txs/sec        4091      2192       5968     45000     
Blocks/sec     0.909     0.287      1        10        

$~/go/src/github.com/tendermint/tools/tm-bench$ tm-bench -T 10 -r 6000 localhost:26657
Stats          Avg       StdDev     Max      Total     
Txs/sec        4999      2632       7481     49990     
Blocks/sec     0.900     0.300      1        9         

$~/go/src/github.com/tendermint/tools/tm-bench$ tm-bench -T 10 -r 8000 localhost:26657
Stats          Avg       StdDev     Max      Total     
Txs/sec        5392      3143       7703     53921     
Blocks/sec     0.900     0.300      1        9         

$~/go/src/github.com/tendermint/tools/tm-bench$ tm-bench -T 10 -r 9000 localhost:26657
Stats          Avg       StdDev     Max      Total     
Txs/sec        5441      2895       8066     54409     
Blocks/sec     0.900     0.300      1        9         

$~/go/src/github.com/tendermint/tools/tm-bench$ tm-bench -T 10 -r 10000 localhost:26657
Stats          Avg       StdDev     Max      Total     
Txs/sec        4962      2859       7187     54578     
Blocks/sec     0.909     0.287      1        10      

```