ストックホルムで開催されたErlang User Conference 2014に参加した。

euc2014_sponsors

The flag of sponsors ato Erlang User Conference 2014

大変有難いことにLeoFSのセッションの一部で、7分ほど登壇させていただいた。

私が話したのは主にLeoFSのユースケースで、

  • 現時点で600TB程度のディスク総量でクラスタを組んでいる
    • データセンター間のレプリケーション機能を使っていきたい
  • 社内のファイル共有にownCloudをLeoFSと組み合わせて使っている
    • 各国のグループ会社との動画の共有などに使われている

というようなことを紹介した。
私たちのセッションには30名ほどの方が聞きにきてくれていたかと思う。

Day1

初日は以下のセッションに参加した。

  1. Welcome to the Erlang User Conference!
  2. Keynote: Composing a Functional Community (Katie Miller)
  3. Scaling and High Performance Storage System: LeoFS (Yosuke Hara) => 発表
  4. The Last REST Client You Will Ever Need (Loïc Hoguin)
  5. Concuerror: Into Real Code (Stavros Aronis)
  6. Building a Distributed Data Ingestion System with RabbitMQ (Alvaro Videla)
  7. Building a Cloud with Erlang and SmartOS - How Hard Could it Possibly Be? (Heinz Gies)
  8. Locks - Erlang-style Scalable Distributed Locking (Ulf Wiger)

Composing a Functional Community

初日のキーノートはLambda Ladiesという関数型言語の女性コミュニティから、Katieさんによる発表。

FP(Functional Programming)コミュニティの発展には以下が必要というお話でした。

  • Education ビギナー向けの教育
  • Safe space ハラスメント対策とか
  • Mentoring 励ます メンティーはメンターになっていく

今のテックスペースやコミュニティはデフォルトで男性向けである話や、実際に女性達が感じていることが紹介されていて、ほとんど男性で埋まっていた会場に対してパンチの効いた発表。
Haskellによる6つのソートアルゴリズムがプリントされたギークドレスも印象的でした。

The Last REST Client You Will Ever Need

webサーバのcowboyの開発者であるLoicさんによる発表。

REST APIに使うMedia TypeにJSON、Msgpack、HTML、XMLに代わってBEDというのを考えてるよ、という話。
Media Typeは独自の定義が使えるので、以下のようなタイプを提唱していた。

  • application/x-bed
  • application/x-bed-stream

バイト数は短く、圧縮もなしで、relationも定義できて・・というようなものを目指しているよう。
現時点では構想の段階でレポジトリはないが、プロジェクトは作成されている。 https://github.com/bed-project

ヘルプ絶賛募集中とのことなので、BEDが気になった方はLoicさんにコンタクトをとるといいと思う。

Building a Distributed Data Ingestion System with RabbitMQ

“RabbitMQ in Action"の著者のAlvaroさんによるRabbitMQのデザインパターン紹介。

複数のDC間でのログ集めにRabbitMQを使ってるらしい。
スケールしていくにはFederation Pluginを使うといいよという内容。
性能が必要だが、メッセージのロスが許されるような場合はno-ackモードという選択肢もあるとのこと。

以下のデモページでメッセージが分配される様子を紹介しながらの発表だった。

各workerにメッセージが分散される様子を見れるデモページは、ついついポチポチ押したくなってしまう。
正規表現を使ってのメッセージの内容に応じたルーティングもできる模様。

Fedarationを使った分散の例は以下のリンクでもJavaのコードを交えて紹介されているようだ。 http://jaxenter.com/distributed-log-aggregation-with-rabbitmq-federation-49154.html

Day2

二日目に参加したセッションはこちら。

  1. Welcome to the 2nd Day of the EUC!
  2. Keynote: Erlang, Open Networking, and the Future of Computing (Stuart Bailey)
  3. Powering your Web and Mobile Applications (Jordan Wilberding)
  4. Monitoring Erlang Systems with WombatOAM (Richard Jonas)
  5. Scaling Erlang on 10K or More Cores: An Overview of the RELEASE Project (Simon Thompson)
  6. Real-Time Performance at Massive Scale (Francois Orsini)
  7. Where Shall I Parallelize? (Tamás Kozsik)
  8. Elixir Tooling: Exploring Beyond the Language (Eric Meadows-Jönsson)
  9. Latest News from the OTP Team - Kenneth Lundin
  10. Announcement of the Erlang User of the Year & the Most Influential Talk of 1999

Elixir Tooling: Exploring Beyond the Language

ElixirコミッターのEricさんによる発表。

はじめにElixirの今年のニュースとして以下の3つを挙げていた。

  • version1.0がリリース予定
  • ElixirConfが開催予定
  • パッケージマネージャのHexがリリースされた

Mix

Mixというのはプロジェクト作成、コンパイル、テスト、などなどをサポートしてくれるツール。 ErlangのrebarやRubyでのrakeやbundleに似たことをしてくれる模様。

以下のツールを入れると、Mixのコマンドが拡張されるようだ。

ectoはDBのラッパーや管理を提供し、exrmはリリースをサポートしてくれる模様。

Hex

Elixirのパッケージマネージャで最近リリースされたばかりのようだ。
パッケージはS3でホスティングされてるとのこと。

IEx

Erlangでいうところのerl, Rubyでいうところのirbにあたる、Elixirの実行ターミナル。

IEx.pryを書いておくと実行中のコードの途中でiexに入ってデバッグできるらしい。pryにインスパイアされたものだそうだ。

iexシェルの中ではh Enum.map/2とかするとヘルプも見えるとのこと。

ExUnit

tagsやfilter機能を使うと環境毎にテストを分けたり、特定ケースだけ実行することができるようだ。

またElixirではdoctestも提供されているとのこと。この形式で書かれたコメントは、後でドキュメントとして生成されるだけでなく、書かれているコードはテストとしての実行もしてくれる。

Standard library

Latest News from the OTP Team

OTPチームからの17系以降の変更点の紹介。

  • 新しいデータ型のMaps
  • binary周りで発生していた、スレッドにおけるブロックが減る
  • ライセンスがEPL(Erlang Public License)からApache License Version 2.0に代わる

ライセンスに関しては以前、Mozilla Public Licenseへの移行も検討されていたようだ。 ライセンス変更にあたり、コミッターの方々にはメールで同意を求めるので"Yes"という準備しておいてね!というようなことを言っていた。

Day3

最終日は以下のチュートリアルに参加した。

  1. Introduction to Load Testing with Tsung (Radosław Szymczyszyn)
  2. Erlang in Production - Tricks and Tools for Running Erlang Production Systems (Jesper Louis Andersen)
  3. Load Testing Made Easy (Diana Corbacho)
  4. Deploying and Monitoring Erlang Nodes in the Cloud (Csaba Hoch)
euc2014_ericsson

Ericsson Group headquarters

WombatOAMやMegaloadといったErlang監視ツール、ロードテストサポートツールにも実際に触れることができたがこちらはOSSではないようだ。

Introduction to Load Testing with Tsung

ロードテストツールであるTsungの紹介。こちら、Erlang製のJMeterのようなもの。

チュートリアルは以下の資料に従い、Vagrantで構築された複数VMを使って行われた。Tsungの資料はあまりないと思われるので貴重だ。

Tsungに関するメモ。

  • 指定されたユーザ数でランダムなアクセスをシミュレーションできる

    • XMPP、TCP、HTTPなどのロードテストができる
    • ログインパスワード指定できる
    • ユーザによってはログインしかしないとかシミュレーションできる
    • パスにIDとかいれてリクエスト生成してくれる
  • 今回のサンプルでdurationが14400 minutesなのは十分に大きくするため

  • ディレクトリ構成やログインユーザ、elrangのcookieなど環境揃っている必要があるが、複数のノードからtsungの実行もできるらしい

  • テストの結果はtsplotとかでグラフにできるらしい

  • テスト時に、ulimit -nの上限に引っかかる可能性あるので注意しておく

  • クラスタでやるときはtsung-controllerというのもあるらしいが、使用には注意らしい(SPOF?)

  • dumptrafficというオプションをオンにすると、大量のログがでるので注意

  • JMeterと違ってErlangなので、テスト時にはerlangのメソッドを直接呼ぶようなテストもできるらしい

  • 発表者プロフィール: http://www.erlang-factory.com/euc2014/radosaw-szymczyszyn

Erlang in Production

運用者が朝まで寝ていられるシステムをつくるにはどうすればいいかという話。

まず、システムはいつ壊れるのかという話を"How Complex Systems Fail"というRichard Cookさんの資料を引用しつつ紹介。 たぶん元の資料はこちら

紹介されていたライブラリの一部。

上記のライブラリは、Erlangプロセスの情報を収集したり、ジョブスケジューリングをしてくれるもののようだ。

以降は、使ってるライブラリや設定の話。

sys.configについて

erl -man configでも確認できるがconfigは、他のファイルも読めるので環境ごとのファイルを置いておくようにするといいらしい。

Lager

https://github.com/basho/lager

logライブラリにはlagerを使って、どこかに集めている。 folsomのデータ飛ばしてるらしい。

alarm_handler

SASLの一部。アラートは自分で定義できて、Nagiosサーバにもデータ飛ばすこともできる。 アラームがオフになる時(?)にlagerに流し込むとかもできる。

Nagiosと組み合わせる際は、ファイル書き出されたステータスをNagiosが定期的に確認するようにしていたらしい。

os_mon

http://erlang.org/doc/man/os_mon_app.html

cpu usageみたりもできる。mem_supでメモリ使い過ぎ検知もできる。

fuse

https://github.com/jlouis/fuse

マウントに使うfuseとは別のErlangライブラリ。
たとえばmysql落ちた時にほかのノードの処理をキックするのに使う。

Folsom

https://github.com/boundary/folsom

メトリクスのライブラリ。

データ転送にはUDP使ってる、リモートが落ちてたり遅いことに影響されないように。
counters, gauges, spirals, histogramsなどのグラフが用意されている。
グラフを見るに当たっての注意点としては、平均を見るのは危険。低い方と高い方に値が固まっているかもしれないので。なので、95th、99thパーセンタイルの情報をみるべき。

なにを集計する?

取れるものすべてを集計してる。

  • query times
  • internal heavy weight processing
  • API endpoints
  • every cascading subsystem
  • cache hit/miss, あとDBたたいた時にどうだったのか

Tracing / Recon

reconは各pidが何を実行しているかわかるようにしてくれるらしい。 recon_traceでオンラインtracingもできるらしい。

会場の写真

カンファレンス会場に使われた建物。

euc2014_venue

The venue of EUC2014

カンファレンス会場では何故かファミコンが置かれていて、グラディウスやボンバーマンをプレイされていた。コナミコマンドは使っていないようだ。

euc2014_game

Game space at EUC2014

カンファレンス会場でのランチの様子。

euc2014_lunch

Lunch time at EUC2014

チュートリアルで使われたEricssonの一室。

euc2014_tutorial_room

Tutorial room at Ericsson

Ericssonでのランチ。スウェーデンではサンドイッチの出る場面が多い。

euc2014_tutorial_lunch

Lunch time at Ericsson

おわりに

EUCに参加するのは二度目で、前回は2012年のEUCに参加していた。

以前は日に何度かあるコーヒブレイクの45分が非常に長く感じられたのだが、今回は会場で知り合った方と話せたこともあってか、あっという間に感じられた。
英語への敷居が前よりも下がったのかもしれない。コーヒーを取るタイミングで、目が合ったら"hi"と言ってみたりもした。
わずかだがJoe Armstrongさんとも話せて嬉しい限りだ。

また、あまり前回は意識していなかったが、発表者はみんな英語が母国語とは限らない。
よく聞いていると、言いたいことが出てこなかったり、発音を気にして言い直したりしている。
ヨーロッパの各地から来ている人がいるので、イントネーションも様々だった。
英語での発表には、多少の不自由を感じながらもみんなやっているのかもしれない。

最後に、今回の発表・参加にあたってレビューや調整をしてくれた皆様に感謝します。