お財布に優しいCatapult 4000TPSチャレンジ (その1)

## Catapult 4000TPSチャレンジについて
2018/02/18 追記
このチャレンジがプライベート・ネットワークでのテストであることを明記しました。

こんにちは。最近Blockchainの勉強を始めたインフラエンジニアの@hide825jpです。

皆さんは、NEMを使ってますか？私は全く使ったことがなかったのですが、先月開催された「NEMBOOT CAMP」に勉強がてら参加してきました。

[NEM Bootcamp - Hello, Blockchain!](https://nembootcamp.connpass.com/event/114137/)

どのセッションも興味深いものでしたが、インフラエンジニアの私にとっては、@planethoukiさんの「Catapult 実験室『4,000トランザクション・チャレンジの報告と募集』」セッション、それにセッションの中で発表された4,000トランザクション・チャレンジ募集、これが、とても興味を引きました。

ということで、チャレンジに応募してみました。
[Catapult 4000 TPSチャレンジ　応募フォーム](https://docs.google.com/forms/d/e/1FAIpQLSfAV5eAHqO6prHCNOLEemQ1kv5W_HP-wr6UO8YSAEN7kRx_ZA/viewform)

## 参考にさせて頂いたこと
4000トランザクション/秒というのは、ビットコインやイーサリアムとは桁が数桁違います。個人でそんな挑戦ができるんでしょうか。

ただ、すでに@planethoukiさんが挑戦された詳細な記事があり、その後@44uk_i3さんのチャレンジ記事もあり、正直軽い気持ちで応募したのですが、、、。

- [プライベートチェーンのカタパルトで秒間4000トランザクションを目指してみる](https://qiita.com/planethouki/items/9733aa83096a988ee57a)
- [複数のCatapultノードで4,000TPSに挑戦してみた(瞬間4,000TPS)](https://qiita.com/44uk_i3/items/020007b738ac85af6eb2)

@planethoukiさんの記事を読んでいただくとお分かりのように、
####Azure VMのF32s_v2インスタンス -> 月額 17万なり。。

これは検証で数日使っても、それなりの金額になりますね。私のお財布にはとても痛いです。やはり法人レベルでないと厳しいのでしょうか。

でも、がんばってみました。私のチャレンジの切り口は、
#### お財布に優しいにCatapult 4000TPSチャレンジ
で、やってみました。

検証は、@planethoukiさんの以下のスクリプトのお世話になっております。
https://github.com/planethouki/yonsen.git

今回の検証で異なる点は、@planethoukiさんのスクリプトでは、Catapultと負荷テストスクリプトが同じサーバで動くことになりますが、これは分離することにしました。コードの変更点は、ターゲットURLを「localhost」からCatapultサーバのIPに変更しただけです。

また、Catapultの構築は「catapult-service-bootstrap」を、そのまま使用しています。
https://github.com/tech-bureau/catapult-service-bootstrap
## AWSでのチャレンジ
まずは、AWSで検証してみました。

構成図はこんな感じです。後で出てくるGCPもほぼ同じ構成です。負荷テスト用のサーバは、テストスクリプトが8スレッドで動くので、8コアの「c5.2xlarge」としてします。

これは、あくまでもVPC内でのテストです。
**つまり、プライベート・ネットワークでのテストなります。GCPでのテストも同様です**。
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/54806/9eeee82f-3f6b-b525-e3fa-f0ef1555f0db.png)
Catapultサーバのインスタンス・サイズは「c5.4xlarge」としました。
「c5.4xlarge」は「コンピューティング最適化 」の「現行世代」です。スペックはこんな感じです。

**vCPUコア:  16**
**メモリ:    32GB**
**ストレージ: EBS**
**OS: Ubuntu 18.04LTS**
そして、お値段は、東京リージョンで「**0.856USD/時間**」です。

なので、24時間x30日動かすと、  
#### 0.856  X 24 X 30  = 616.32 USD ≒ 6万8千円くらい 

これに転送量やディスクへの課金、負荷テスト用のインスタンスの料金もかかります。
AzureのF32s_v2インスタンスより、だいぶ安くなりました。でも、まだまだ高いですね。

## AWSでの結果
それで、前置きはいいとして、結果です。
####トランザクション/秒 = 1 Blockのトランザクション数 ÷ そのBlockの生成時間
で、計算してます。

トランザクションの結果をPythonのpandasで整形して、matplotlibで表示するとこんな感です。

- トランザクション数の結果
![aws_cpu16_remote.png](https://qiita-image-store.s3.amazonaws.com/0/54806/38bccbc2-1585-cbfb-1914-66c8586e1d16.png)

「**cadvisor**」 -> 「**Prometheus**」 -> 「**Grafana**」で、テスト時のCatapultサーバのDocker状況を表示すると、こんな感じになります。

- 各DockerコンテナのCPU使用率
<img width="1096" alt="スクリーンショット 2019-02-09 18.05.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/54806/ae82e201-43ef-c76c-d52d-c85fed5352b0.png">

- ネットワーク(受信)
<img width="1093" alt="スクリーンショット 2019-02-09 18.05.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/54806/aae93a37-c180-7359-34a8-ce457463d93f.png">

- ネットワーク(送信)
<img width="1088" alt="スクリーンショット 2019-02-09 18.05.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/54806/e3764209-1d5e-357b-9219-6a55cf3b26dc.png">

- メモリ消費状況
<img width="1091" alt="スクリーンショット 2019-02-09 18.05.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/54806/1403322e-78e3-fe02-5091-04c4f9390492.png">


瞬間的に4000トランザクション/秒を何度か越えてます。ただ、リソース使い切ってないですね。。。CPUコアはホスト側のCPUリソースと合わせても16コアは必要なさそうです。メモリは無駄に大きいだけですね。
ということで、「c5.4xlarge」のひとつ下「c5.2xlarge」(8コア)でも試したのですが、瞬間的に4000TPSがで出ても、Catapultの動作が不安定でデータが取り出せなかったりで、今回のチャレンジでは断念しました。

NEM素人でもすんなり4000トランザクション/秒を実現できるのは、やっぱりCatapultはすごいのかもしれません。でも、インフラ的にはまだ工夫の余地はありそうですね。

## GCPでの仕切り直し
ということで、コア数の選択で融通の利く、GCPで再テストすることにしました。

結論から言うと、4000トランザクション/秒が出た一番スペックの低い単一インスタンスはこんな感です。

**vCPUコア: 10**
**CPUプラットホーム Skylake以降**
**メモリ: 10GB** (これは必須ではありません。9GB以上しか選択できなかったので)
**OS: Ubuntu 18.04LTS**

そして、東京リージョンでのお値段は、設定時のGCPコンソールの月間予測で「**$235.76**」でした。日本円にすると**2万円後半**といったところでしょうか。
でも、検証なので「**プリエンプティブ**」でもいいですね。「プリエンプティブ」をオンにした場合は、月額予測が「**$73.58**」と出ました。
https://cloud.google.com/preemptible-vms/?hl=ja

####日本円で月額8千円台前半ですね !!!
それにGoogleさんがサーバを勝手に停止するので、この金額を下回ってくるはずです。

ところで、トランザクションの結果はこんな感じです。GCPでの負荷テストサーバも、AWSと同様にCPUを8コアとしました。
![gxp-txt.png](https://qiita-image-store.s3.amazonaws.com/0/54806/34f6a732-1919-452c-c87b-6178fa206d47.png)
また、リソース消費の状況はこんな感じです。

- 各DockerコンテナのCPU使用率
<img width="1116" alt="スクリーンショット 2019-02-16 20.25.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/54806/780728f9-e1ec-e01b-9c89-64e4d92de7e4.png">

- ネットワーク(受信)
<img width="1114" alt="スクリーンショット 2019-02-16 20.26.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/54806/9b643a37-7069-764d-467a-9594080fba81.png">

- ネットワーク(送信)
<img width="1116" alt="スクリーンショット 2019-02-16 20.25.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/54806/ab4a6f31-d914-cb39-50ad-96d83d364df6.png">

- メモリ消費状況
<img width="1112" alt="スクリーンショット 2019-02-16 20.26.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/54806/ea125f57-7411-470e-9f6c-04e5bb16ad25.png">

なんとか、4000トランザクションが出てますね。。。

## 最後に
最終的に自分のお財布で、なんとかなりそうな金額でチャレンジができました。

しかし、NEM素人の私ではつたない部分も多々あり、テスト手法については再検討が必要かと思います。特にテスト時の取引の中で、XEM残高をうまく調節するのが難しいようです。その他、改善すべき点は多数あり、より厳密な検証を後日やってみたいと思います。

いずれにしても、
####チャレンジにかかる費用は工夫次第でだいぶ安くなりそう、
です。みなさんも挑戦してみてはいかかでしょうか。