はじめに
このベンチマークはあくまでどの程度コンセンサスに時間がかかり、マシーン数を増やすとどの程度遅延が発生するかを定量的に知るために行なっています。また、スペックにも気を使っていません。。
TendermintのTPS検証
Tendermintでの処理スピードについて実際に調べてみる。TPSとは、一秒間あたりの秒間トランザクションを意味し、実際の決済やゲームでは一定水準以上のスピードが求められます.
TPSについては,詳しくは,以下のスライドが参考になります.
https://speakerdeck.com/r_etx/tps-and-51-percent-attack
今回は、Tendermitのベンチマークツール、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の最高値を用いてグラフを作成しました。本当は、丁寧にやるべきところですがざっくりと振る舞いを見るために、このような荒いことを行なっています。
このグラフを見ると、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