はじめに
Elixir/Erlangで書かれたプログラムはErlang VMという処理系で実行されています。VM内部では軽量プロセスと呼ばれる処理の実行単位が互いにメッセージを送りあったり、link
やmonitor
を使って監視しあい並列分散的に全体的な処理を前に進めます。
軽量プロセス間の関係はElixir/Erlangプログラムのキモで図を用いての理解が広く行われていますが、意外にもその可視化はErlang標準のobserver
というモジュールしか有力なものがありませんでした。
本稿では最近リリースされたvisualixir
というElixirで書かれた軽量プロセスのビジュアライジング・ツールを紹介します。
Visualixrとは
簡潔にまとめると以下のような感じです。
- https://github.com/koudelka/visualixir
- Elixir/Phoenix製
- サーバを立ててブラウザで見る
- Erlang VMノードならプログラムがErlangで書かれていようがElixirで書かれていようが問題ない
使ってみる
必要なもの
- Elixir1.0以上がインストールされた環境
- npm(バージョンが新しすぎると
npm install
に失敗しました。バージョン依存があるかもで。2.1.17
だとうまくいきました) - Chrome(動作確認されているブラウザ)
インストール
https://github.com/koudelka/visualixir/blob/master/README.md に書かれている通り。
mix deps.get && mix compile && npm install
elixir --sname visualixir --hidden -S mix phoenix.server
これでノードがたちあがりサーバが立ったのでブラウザてhttp://localhost:4000
を叩いてみましょう。
自身のノードを覗いてみる。
visualixr@~~
という名前でつくったノードがvisualixir自身がいるノードです。ノード名をクリックするとノード内のプロセス間グラフ構造が現れます。
簡単に移動拡大縮小ができるのが素晴らしい。プロセスをドラッグするとボヨンボヨン動きます。
Erlangノードを覗いてみる
せっかくなんでErlangシェルを立ち上げてノードを見てみましょう。
ノード名を指定することを忘れずにシェルをたちあげます。
erl -sname hoge
ノード名を直接書いてもうまくいかないことが多いので(まだ安定してないんでしょうか?)しばらく待ってからブラウザをリロードしてみましょう。ノード同士が互いに認識しあっているとhoge@~~
が選択できるようになっているはずです。
バックグラウンドでこれだけのプロセスがいるんですね。新しくプロセスを作ってみましょう。
(hoge@massn)1> Pid = spawn(fun() -> timer:sleep(infinity) end).
<0.76.0>
孤独なプロセスができましたね。PIDを忘れてしまうと生き続けてしまいます。spawn_linkしてみましょう。
(hoge@massn)2> Pid2 = spawn_link(fun() -> timer:sleep(infinity) end).
<0.79.0>
今度はlinkされているので母体のプロセスにつながっていますね。最後にプロセスを作りまくってみましょう。
(hoge@massn)3> lists:map(fun(_) ->
(hoge@massn)4> spawn_link(fun() -> timer:sleep(infinity) end)
(hoge@massn)5> end, lists:seq(1, 50)).
[<0.88.0>,<0.89.0>,<0.90.0>,<0.91.0>,<0.92.0>,<0.93.0>,
<0.94.0>,<0.95.0>,<0.96.0>,<0.97.0>,<0.98.0>,<0.99.0>,
<0.100.0>,<0.101.0>,<0.102.0>,<0.103.0>,<0.104.0>,<0.105.0>,
<0.106.0>,<0.107.0>,<0.108.0>,<0.109.0>,<0.110.0>,<0.111.0>,
<0.112.0>,<0.113.0>,<0.114.0>,<0.115.0>,<0.116.0>|...]
めっちゃできました。
まとめ
勉強用、デバッグ、システム運用といろいろ使えそうですね。