AWS
EC2
Elixir

FlowのStage数を増やして実行してみた

この記事は「fukuoka.ex x ザキ研 Advent Calendar 2017」24日目です。

昨日は @Takeshi-Kogu さんの「モジュールをファイルに書き込んでみる(後半)」でした。

はじめに

前回までに,
- 「Elixirで一千万行のJSONデータで遊んでみた」
- 「Elixirで一千万行のJSONデータで遊んでみた #2」
という記事を書きました。

そこで, Flow.from_enumerables に渡すStage数増やしたらどれくらい変わるのだろう? という疑問が生まれました。 

と,いうわけでやっていきます!!!!

動作環境

自分のMacBook Proだとコア数が乏しいのでAWSを利用してみました。

  • Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type
  • m5.24xlarge
    • vCPU 96コア
    • ECU 345
    • メモリ 384 GiB
  • Elixir 1.6.6 (compiled with OTP 21)

EC2インスタンス内のElixir環境の構築はDockerを利用しました。

ソースコード

lib/basic.ex
defmodule Basic do
  def q2_3(stage) do
    :timer.tc( fn ->
    "data.json"
    |> File.stream!
    |> Flow.from_enumerable(stages: stage)
    |> Flow.map(fn d -> Poison.decode!(d) end)
    |> Flow.filter(fn d -> d["age"] <= 20 end)
    |> Enum.count end)
    |> elem(0)
    |> Kernel./(1000000)
  end
end

実行結果

各Stage数ごとに10回計測を行いました。
その中で最速のものを載せました。

Stage数 実行時間(s)
4 7.457921
8 5.685359
16 5.59761
32 5.690283
64 6.001949
96 6.141198
192 6.184196

この環境だと,Stage数 16で実行した場合が一番実行時間が短い結果になりました。
今回,平均は載せていないですが平均実行時間も同様の結果となりました。

終わりに

今回は,前回までにやった一千万のJSONファイルを利用して,FlowのStage数を増やすとどうなるのかをみていきました。
環境の問題かもしれませんが,並列数を増やせば速くなるという問題でもないようですね。

ローカルだと37秒ほどかかっていた処理が5.6秒ほどで終わったので,計測がとても楽でした。。


明日は @zacky1972 さんの「ZEAM開発ログ v.0.3.1 非同期NIF呼出しにより1ms制約をクリアしてGPU駆動のパフォーマンスが改善された件」です。お楽しみに。