LoginSignup
17
3

More than 5 years have passed since last update.

ElixirでIoT#1.3:IoTボードで動いた!Phoenixが立った!性能評価と考察

Last updated at Posted at 2018-05-11

この記事は「Elixir or Phoenix Advent Calendar 2017」の17日目です.
昨日は@zacky1972さんの「ZEAM開発ログv0.1.2 AI/MLを爆速にしたい! Flow のコードを OpenCL で書いてみる〜CPU編」でした.

:black_square_button::black_large_square::black_square_button: お知らせ :black_square_button::black_large_square::black_square_button:
「fukuoka.ex#11:DB/データサイエンスにコネクトするElixir」を6/22(金) 19時に開催します
私も「ElixirでIoTやってみた」ネタで発表します!是非ともご参加下さい!!

https://fukuokaex.connpass.com/event/87241/

なお発表ネタへの仕込みはまだ成果ゼロです,,,
発表駆動開発は進捗を確実に生み出せますがオススメはしません^^;

はじめに

こんにちは.
組込マーとはいってもC至上主義から抜け出したい今日この頃です.

先日の勉強会「fukuoka.ex#8(福岡Elixir会):2018年 春のElixir入学式」にて発表した内容を加筆編集しながら,ElixirをIoTボードで動かしたらどうなんの?という異色ネタをお届けしています.

これまでの記事では,IoTボード上でElixirが実行できる環境を構築し,性能評価のためのベンチマークアプリを整備してきました.

今回はいよいよ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にアクセスしてみました.

スクリーンショット 2018-05-07 19.44.54.png

安心してください,立ってますよ!?

なお,今回はまだ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データ表示
です.

17
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
3