Edited at

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


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でのテストも同様です

スライド1.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

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


  • 各DockerコンテナのCPU使用率

    スクリーンショット 2019-02-09 18.05.21.png


  • ネットワーク(受信)

    スクリーンショット 2019-02-09 18.05.35.png


  • ネットワーク(送信)

    スクリーンショット 2019-02-09 18.05.44.png


  • メモリ消費状況

    スクリーンショット 2019-02-09 18.05.50.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

また、リソース消費の状況はこんな感じです。


  • 各DockerコンテナのCPU使用率

    スクリーンショット 2019-02-16 20.25.38.png


  • ネットワーク(受信)

    スクリーンショット 2019-02-16 20.26.55.png


  • ネットワーク(送信)

    スクリーンショット 2019-02-16 20.25.45.png


  • メモリ消費状況

    スクリーンショット 2019-02-16 20.26.08.png


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


最後に

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

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

いずれにしても、


チャレンジにかかる費用は工夫次第でだいぶ安くなりそう、

です。みなさんも挑戦してみてはいかかでしょうか。