エムスリーエンジニアの松原 @ma2ge です。
2017/09/18から09/20に広島にて開催された RubyKaigi 2017 にて Gold Sponsor としてスポンサーしました。 弊社からは今年4月新卒入社の加藤 @m3_ryo_kato2 と私松原の2名が参加しました。 今回初めてスポンサーブースも設置させていただき、swag にはマスクとうちわをご用意しました。
周りのスポンサーブースを見渡すとみなさまテーブルクロスをしておりましたので慌ててパッチを当てて version 2.0 をリリースし直しました。
ブースに訪れていただいたり、話しかけていただいたりと皆様ありがとうございました。 お好み焼き美味しくて広島も最高でしたね。
エムスリー と Ruby
Kaigi 中「エムスリーが Ruby を使っていることを知らなかった。」という声をいくつかいただいたのですが、 2012 年くらいから本格的に使い始め、今では大体 40 〜 50% くらいのアプリが Rails で作られており、メインの言語の一つとなっております。
Ruby コミュニティへの貢献という形では、Tokyo RubyKaigi 11 での Ruby3 Sponsor、昨年の RubyKaigi 2016 で Gold Sponsor をさせていただいております。
- スポンサー - Tokyo RubyKaigi 11 #tkrk11 http://regional.rubykaigi.org/tokyo11/sponsors/
- Sponsors - RubyKaigi 2016 http://rubykaigi.org/2016/sponsors
次の RubyKaigi 2018 は仙台ということですので、何らかの形で引き続き継続したいと考えております。
ちなみに Rails が半分くらいという話をしましたが、Ruby 以外の言語も色々と使っていて、それらのコミュニティへもスポンサーしてたりします。この辺りの話はまた別の機会に。
個人的によかったと思う2つのセッション
いずれもよかったのですが、個人的観点で2つ選ぶならコレというものをあげさせていただきます。
Pattern Matching in Ruby
1つは @yotii23 さんのパターンマッチを Ruby に入れるという話です。 理由は Ruby 本体に手を入れて、さらにそのリポジトリを公開もしているという点と、私が Elixir 言語信者という点です。
@yotii23 さんは Programming Elixir を日本語訳し出版されている方でもあるのですが、 Elixir 言語のコードを例示しながらパターンマッチの紹介をしてくれました。 私も Elixir を書くときはパターンマッチを使いますし、 Ruby にも入ってくれたら嬉しいと思っていたので、興味深くセッションを聞いておりました。 ちなみにエムスリーも Elixir を本番で使っていますが、これはまた次の機会に話します。
Ruby とパターンマッチでいうと、いくつかの gem があります。 例えばセッションでも紹介されていた、@k-tsj さんの pattern-match gem ですとか、 Egison 言語を作られている @egison さんの egison gem とかですね。
ですが本発表では gem ではなく Ruby 本体を変更してしまうというところが新鮮で面白かったと思います。 またそのコードを公開されておりますので、同じようにすることで自分自身でも再現ができますし、 目的に対してどのように Ruby を変更していくのかも分かるので私としては大変勉強になりました。
Resources
- Pattern Matching in Ruby - RubyKaigi 2017 http://rubykaigi.org/2017/presentations/yotii23.html
- スライド、講演動画へのリンクがあります
- yakitorii/pattern-match-ruby: This project is to try Pattern Matching in Ruby. It's a conceptual model. https://github.com/yakitorii/pattern-match-ruby
- k-tsj/pattern-match: A pattern matching library for Ruby https://github.com/k-tsj/pattern-match
- egison/egison-ruby: A Ruby gem for non-linear pattern-matching against unfree data types https://github.com/egison/egison-ruby
Memory Fragmentation and Bloat in Ruby
2つ目は @nateberkopec さんで Ruby のメモリに関するパフォーマンスの話です。 こちらを選んだ理由はメモリ消費事例について分かりやすく説明してくれたこと、 スライドが Deckset で作られていて私も Deckset ユーザの一人で共感したためです。
@nateberkopec さんは The Complete Guide to Rails Performance の著者で、Rails のパフォーマンスについてのコンサルタントをしておられるようです。 今回の発表では Ruby のメモリに関するパフォーマンス劣化を引き起こす原因をいくつか紹介しながら、 Ruby の下回りの仕組み、対処方法について紹介してくれました。
例えば以下のような事例を紹介してくれました。
- Rails で
User.all.each { |u| ... }
を実行してしまう(これはよく耳にする事例ですね)- ユーザ数が多い場合に一気にメモリが消費される
- Puma が Unicorn よりもメモリを消費するケース(スレッドモデルなので驚きました)
- 特にスレッドをたくさん作って、その上でメモリも確保するようなアプリケーション
- glibc にスレッドごとのメモリアリーナ機能というものがあり、スレッドごとにメモリ領域(アリーナ)を確保するためにこのようなことが起こり得る
対処方法については Ruby コード側でなんとかするというのもあるのですが、Ruby がメモリ管理をしているのだから、 なるべく Ruby コードでは意識しないようにしたいということで以下のようにいくつか紹介されていました。
- glibc のメモリアリーナ機能で確保されるメモリ領域を抑えるために
MALLOC_ARENA_MAX
環境変数の設定を見直す - glibc ではなく別の malloc 実装、例えば jemalloc を使う(jemalloc はメモリのフラグメンテーションに効くようです)
ただし何れにしてもトレードオフの関係があることは意識しておく必要があります。例えば MALLOC_ARENA_MAX
の値を下げることでメモリ消費量は減るが、その分メモリのロックを取る確率が上がり速度が下がるなど。
私としては Puma のメモリ消費事例、スレッドごとのメモリアリーナ、jemalloc のいずれについても知らなかったことでしたので、 知ることができてよかったですし、Ruby の下で何が起こってるかについて少しだけ詳しくなり有意義な時間となりました。
Resources
- Memory Fragmentation and Bloat in Ruby - RubyKaigi 2017 http://rubykaigi.org/2017/presentations/nateberkopec.html
- スライド、講演動画へのリンクがあります
- Tuning glibc Memory Behavior | Heroku Dev Center https://devcenter.heroku.com/articles/tuning-glibc-memory-behavior
- MALLOC_ARENA_MAX がどんなものか概要を掴むのにわかりやすいです
- jemalloc http://jemalloc.net/
最後に
毎回思うのですが RubyKaigi のクロージングはこみ上げるものがありますね。年々涙腺が弱くなっている身としては、堪えるのがだんだん辛くなってきております。 クロージングでも言われていたのでここでも言いますが、今回の RubyKaigi には仕事として参加しており、旅費周り含めてサポートもしてもらっております。
エムスリーではエンジニア仲間を募集しています!
エムスリーでは Ruby, Rails などのテクノロジーを活用して医療に貢献するエンジニアの仲間を募集中です!勉強会の見学やカジュアル面談も随時受け付けてますのでご興味があれば以下よりご応募ください!