この記事は「Elixir or Phoenix Advent Calendar 2017」の17日目です.
昨日は@zacky1972さんの「ZEAM開発ログv0.1.2 AI/MLを爆速にしたい! Flow のコードを OpenCL で書いてみる〜CPU編」でした.
お知らせ
**「fukuoka.ex#11:DB/データサイエンスにコネクトするElixir」**を6/22(金) 19時に開催します
私も「ElixirでIoTやってみた」ネタで発表します!是非ともご参加下さい!!
なお発表ネタへの仕込みはまだ成果ゼロです,,,
発表駆動開発は進捗を確実に生み出せますがオススメはしません^^;
はじめに
こんにちは.
組込マーとはいってもC至上主義から抜け出したい今日この頃です.
先日の勉強会「fukuoka.ex#8(福岡Elixir会):2018年 春のElixir入学式」にて発表した内容を加筆編集しながら,**ElixirをIoTボードで動かしたらどうなんの?**という異色ネタをお届けしています.
これまでの記事では,IoTボード上でElixirが実行できる環境を構築し,性能評価のためのベンチマークアプリを整備してきました.
- ElixirでIoT#1.0:IoTボードへのLinux環境の準備
- ElixirでIoT#1.1:IoTボードへのElixir環境の構築とEEloTツールキットの紹介(12/07版・05/01公開)
- ElixirでIoT#1.2:いろいろ分かるベンチマークを整備してみる(12/12版・05/06公開)
今回はいよいよElixir成分もIoT成分も高くいきましょう!!
EEloTツールキットを用いてIoTボードの性能あれこれを評価した結果をお送りします.また,前回の記事で書き忘れていたベンチマークアプリの動かし方も紹介します.
IoTボードの仕様
本連載で使用したIoTボードのスペックをおさらいしておきましょう.ラズパイは2種類のOSを試しています.
Board | OS | Core | Memory | Network |
---|---|---|---|---|
Raspberry Pi 3 Model B | Raspbian Stretch with Desktop 4.9 / Ubuntu MATE 16.04 | 4x 1.2GHz Cortex-A53 (64-bit) | 1GB LPDDR2 | 150Mbps 2.4GHz 802.11b/g/n WiFi |
ODROID-XU3 | ubuntu-16.04-mate-odroid-xu3-20170731 | 4x 2.0GHz Cortex-A15 + 4x 1.4GHz Cortex-A7 (32-bit) | 2GB LPDDR3 | 300Mbps 2.4GHz 802.11n/g/b WiFi |
ZYBO | Xillinux-2.0 | 2x 650MHz Cortex-A9 (32-bit) | 512MB DDR3 | 1GBit Ethernet PHY |
さーElixirを動かした時の性能はどうなる?
プロセッサアーキテクチャとかOSの違いは影響するのか!?
なお,今回の評価結果は,1回動かしただけのものを掲載しています.本当は何度も測定して平均値とか分散とか見て他プロセスの稼働状況を加味して,,,まぁそういうacademicな細かいことは気にしないでおきましょう.
また,以降の説明では,下記を作業済みであることを前提とします.
-
EEloTツールキットを
$ git clone
してきたディレクトリ上で作業していること -
$ ./setup.sh
を実行済みであること -
$ ./install.sh source
で環境をソースビルドしていること
$ elixir --version
Erlang/OTP 20 [erts-9.3] [source] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
つい先日にElixirのバージョンアップがアナウンスされましたね,,,
演算性能
まずはEEloTにベタのソースで入っている3種類のアプリを一気にいきましょう.
- leibniz_formula.ex:ライプニッツ級数を用いた円周率の計算
- 小数点演算の性能を評価できる
- 和の上限は10^8とする
- fibonacci_simple.ex:フィボナッチ数列計算のシングルプロセス版
- 整数演算およびスタック消費時の性能を評価できる
- 100_000までの数列を計算する
- fibonacci_process.ex:フィボナッチ数列計算のマルチプロセス版
- 並列処理時の性能を評価できる
- 37までの数列を6個同時に,10プロセス並列で計算する
動かし方
EEloTではとってもシンプルです.
$ elixir -e Measure.allex
評価結果
表中の単位は秒です.
Board | OS | leibniz_formula | fibonacci_simple | fibonacci_process |
---|---|---|---|---|
RaspberryPi3B | Raspbian | 114.470 | 14.329 | 14.474 |
Ubuntu | 118.107 | 5.050 | 15.888 | |
ODROID-XU3 | Ubuntu | 48.475 | 6.816 | 6.943 |
ZYBO | Ubuntu | 161.342 | (><) | 41.789 |
ODROID-XU3が最強です!
leibniz_formula
では,単一プロセスなのでマスタコアの1.4GHz Cortex-A7 (32-bit)で動作しているはずなのですが,1.2GHz Cortex-A53 (64-bit)のラズパイ3を軽々とブッチギッています.fibonacci_simple
ではUbuntuだと盛り返していますが,ここまで差が出たのは驚きでした.
古い情報になりますが,64-bitではErlangがメモリを喰うため32-bitに劣るという話しもあるようです.詳しく議論してみたいところです.
そして注目すべきはやはり並列性能でしょう!fibonacci_process
では,物理コアを8個持つODROID-XU3が圧倒しています.マイクロアーキのハンデをコア数で凌駕しています.
ZYBOは,思ったより健闘したけど,まぁ残念でした,,,
なお(><)
のところは,
eheap_alloc: Cannot allocate 220742620 bytes of memory (of type "old_heap").
と言ってお亡くなりになりました.まぁ512MB Memoryですからねぇ^^;
大規模データの処理性能
次はCSVデータ処理アプリであるelixir_agg_csvです.
入力データはfukuokaex5_csvのものをそのまま使います.
動かし方
iex
上で動かします.
EEloTスクリプトがビルドだけでなく入力データの用意まで自動でやってくれるので,やはりとってもシンプル.
$ cd elixir_agg_csv/
$ iex -S mix
iex(1)> ElixirFlow.run("test_300000.csv")
iex(2)> ElixirFlow.run("test_3_000_000.csv")
評価結果
表中の単位は秒です.
Board | OS | test_300000.csv | test_3_000_000.csv |
---|---|---|---|
RaspberryPi3B | Raspbian | 11.128 | 81.776 |
Ubuntu | 9.326 | 82.487 | |
ODROID-XU3 | Ubuntu | 4.828 | 46.956 |
ZYBO | Ubuntu | 34.380 | 284.712 |
ここでもODROID-XU3が圧倒しています!
**高性能なものをドンと置くよりもコアをズラッと並べるほうが有利!**というElixirの特徴は,IoTボードでも活きてくるようです.
先のアプリでは出ていたラズパイ3同士のOS間の差は,本アプリではほぼ無くなっていますね.そもそもErlang VM性能はOSに影響するのか,またまた興味が出てきます.
ZYBOはまぁ,,,FPGAの力を借りてのリベンジに期待ですかね^^;
Phoenixサーバ性能
phoenix-showdownを使ってPhoenixサーバのレイテンシとスループットの性能を評価します.
なお,オリジナルのリポジトリだとElixirのバージョンアップに追従しておらずライブラリの追加変更が必要でしたので,私のGitHubアカウントにforkしたものを使っています.
Phoenixが立った!
ところでそもそもIoTボードでPhoenixは立つのか!?
Webブラウザからhttp://<BoardIP>:4000/showdown
にアクセスしてみました.
安心してください,立ってますよ!?
なお,今回はまだIoTボードにDBまでは導入していません.piacereさんの記事を参考にして導入したいと思っています.
動かし方
まず,IoTボード上では下記を実行します.
$ cd phoenix-showdown/phoenix/benchmarker/
$ mix phoenix.server
その後,母艦のMacbook Proから下記を実行します.
$ wrk -t4 -c100 -d30S --timeout 2000 "http://<BoardIP>:4000/showdown"
4スレッド,同時100コネクション,30秒の負荷を掛けています.
ネットワーク接続の構成も大事そうなので,きちんと紹介しておきます.
- ラズパイ3はオンボードのWiFiモジュール(150Mbps)で無線接続
- ODROID-XU3はUSB-WiFiアダプタ(WLI-UC-G301N,300Mbps)で無線接続
- ZYBOは有線LAN(Trimode (1Gbit/100Mbit/10Mbit) Ethernet PHY)で接続
- まぁこのくらいのハンデはあげましょう,,,
- ルータはBuffalo WCR-1166DSを使用
評価結果
Board | OS | Throughput [req/s] | Latency [ms] | Consistency [σ ms] |
---|---|---|---|---|
RaspberryPi3B | Raspbian | 785.25 | 351.47 | 771.85 |
Ubuntu | 878.89 | 113.30 | 31.68 | |
ODROID-XU3 | Ubuntu | 859.60 | 112.67 | 25.82 |
ZYBO | Ubuntu | 459.28 | 216.72 | 83.10 |
スループットについては**ラズパイ3/Ubuntuに軍配が上がりました!**オンボードWiFiの利点を活かせたのでしょう.
ODROID-XU3も遜色ない結果が出ています.ネットワークの負荷による影響もありますので,誤差の範囲内と言えるかもしれませんね.OSの違うラズパイ3/Raspbianだと劣るのも興味深い結果です.
ZYBOは,,,有線接続のハンデを活かせませんでした^^; ネットワーク接続方法よりもコア性能のほうが大事なのかもしれません.
まとめ
ということで性能評価の全体をまとめます.
- IoTボードでもElixirは動く!Phoenixだって立つ!!
- Elixir並列処理はすごい!マイクロアーキよりコア数!!
- IoTボードでも高性能なものをドンと置くよりもコアをズラッと並べるほうが有利!
- XU3/A15は最大2.0GHzなのも効いている?
- サーバ性能はネットワーク接続方法も大事なのかも?
- Ethernet接続で対決させたら違う傾向になるかも
- ZYBOは健闘はしたものの,,,FPGA活用に期待しましょう
- なお消費電力は??
- ZYBO << XU3 < RPi3 <<<(超えられない壁)<<< Mac
- EEloTを使えば性能の比較評価もお手のもの
演算性能評価のアプリはパラメータを振ってみたらどうなるか面白そうです.さらに,コア周波数を揃えてみたらどんな結果になるかも興味深いです.これらの話しは長くなりそうなので,別記事にまとめたいと思います.
また,バージョン毎・他言語/フレームワークの比較もしてみたら面白いかもしれませんね.
ところでこれってIoT??
まぁネットワークに繋がってるし,,,エッジサーバには使える評価結果だし,,,という言い訳はさておき,やはりIoTは環境センシング/アクチュエーションがキモです.せめてLチカくらいはしたいですよね〜
次回の記事ではこの辺りの実現方法を調査して試してみたいと思っています.
明日のAdvent Calendarは@piacere_exさんによる
「Excelから関数型言語マスター4回目:Webに外部APIデータ表示」
です.