Catapult 4000TPSチャレンジについて
2018/02/18 追記
このチャレンジがプライベート・ネットワークでのテストであることを明記しました。
こんにちは。最近Blockchainの勉強を始めたインフラエンジニアの@hide825jpです。
皆さんは、NEMを使ってますか?私は全く使ったことがなかったのですが、先月開催された「NEMBOOT CAMP」に勉強がてら参加してきました。
NEM Bootcamp - Hello, Blockchain!
どのセッションも興味深いものでしたが、インフラエンジニアの私にとっては、@planethoukiさんの「Catapult 実験室『4,000トランザクション・チャレンジの報告と募集』」セッション、それにセッションの中で発表された4,000トランザクション・チャレンジ募集、これが、とても興味を引きました。
ということで、チャレンジに応募してみました。
Catapult 4000 TPSチャレンジ 応募フォーム
参考にさせて頂いたこと
4000トランザクション/秒というのは、ビットコインやイーサリアムとは桁が数桁違います。個人でそんな挑戦ができるんでしょうか。
ただ、すでに@planethoukiさんが挑戦された詳細な記事があり、その後@44uk_i3さんのチャレンジ記事もあり、正直軽い気持ちで応募したのですが、、、。
@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でのテストも同様です。
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で表示するとこんな感です。
「cadvisor」 -> 「Prometheus」 -> 「Grafana」で、テスト時のCatapultサーバのDocker状況を表示すると、こんな感じになります。
- 各DockerコンテナのCPU使用率
- ネットワーク(受信)
- ネットワーク(送信)
- メモリ消費状況
瞬間的に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コアとしました。
また、リソース消費の状況はこんな感じです。
- 各DockerコンテナのCPU使用率
- ネットワーク(受信)
- ネットワーク(送信)
- メモリ消費状況
なんとか、4000トランザクションが出てますね。。。
最後に
最終的に自分のお財布で、なんとかなりそうな金額でチャレンジができました。
しかし、NEM素人の私ではつたない部分も多々あり、テスト手法については再検討が必要かと思います。特にテスト時の取引の中で、XEM残高をうまく調節するのが難しいようです。その他、改善すべき点は多数あり、より厳密な検証を後日やってみたいと思います。
いずれにしても、
####チャレンジにかかる費用は工夫次第でだいぶ安くなりそう、
です。みなさんも挑戦してみてはいかかでしょうか。