エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

エムスリーは #RubyKaigi 2017 にスポンサーとして参加しました

エムスリーエンジニアの松原 @ma2ge です。

2017/09/18から09/20に広島にて開催された RubyKaigi 2017 にて Gold Sponsor としてスポンサーしました。 弊社からは今年4月新卒入社の加藤 @hashedhyphen と私松原の2名が参加しました。 今回初めてスポンサーブースも設置させていただき、swag にはマスクとうちわをご用意しました。

f:id:ma2gedev:20170927121419j:plain
エムスリースポンサーブース version 1.0

周りのスポンサーブースを見渡すとみなさまテーブルクロスをしておりましたので慌ててパッチを当てて version 2.0 をリリースし直しました。

f:id:ma2gedev:20170927121517j:plain
エムスリースポンサーブース version 2.0

ブースに訪れていただいたり、話しかけていただいたりと皆様ありがとうございました。 お好み焼き美味しくて広島も最高でしたね。

www.instagram.com

エムスリー と Ruby

Kaigi 中「エムスリーが Ruby を使っていることを知らなかった。」という声をいくつかいただいたのですが、 2012 年くらいから本格的に使い始め、今では大体 40 〜 50% くらいのアプリが Rails で作られており、メインの言語の一つとなっております。

Ruby コミュニティへの貢献という形では、Tokyo RubyKaigi 11 での Ruby3 Sponsor、昨年の RubyKaigi 2016 で Gold Sponsor をさせていただいております。

次の RubyKaigi 2018 は仙台ということですので、何らかの形で引き続き継続したいと考えております。

f:id:ma2gedev:20170927121932j:plain
次の 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

Memory Fragmentation and Bloat in Ruby

2つ目は @nateberkopec さんで Ruby のメモリに関するパフォーマンスの話です。 こちらを選んだ理由はメモリ消費事例について分かりやすく説明してくれたこと、 スライドが Deckset で作られていて私も Deckset ユーザの一人で共感したためです。

@nateberkopec さんは The Complete Guide to Rails Performance の著者で、Rails のパフォーマンスについてのコンサルタントをしておられるようです。 今回の発表では Ruby のメモリに関するパフォーマンス劣化を引き起こす原因をいくつか紹介しながら、 Ruby の下回りの仕組み、対処方法について紹介してくれました。

例えば以下のような事例を紹介してくれました。

  • RailsUser.all.each { |u| ... } を実行してしまう(これはよく耳にする事例ですね)
    • ユーザ数が多い場合に一気にメモリが消費される
  • Puma が Unicorn よりもメモリを消費するケース(スレッドモデルなので驚きました)
    • 特にスレッドをたくさん作って、その上でメモリも確保するようなアプリケーション
    • glibc にスレッドごとのメモリアリーナ機能というものがあり、スレッドごとにメモリ領域(アリーナ)を確保するためにこのようなことが起こり得る

対処方法については Ruby コード側でなんとかするというのもあるのですが、Ruby がメモリ管理をしているのだから、 なるべく Ruby コードでは意識しないようにしたいということで以下のようにいくつか紹介されていました。

  • glibc のメモリアリーナ機能で確保されるメモリ領域を抑えるために MALLOC_ARENA_MAX 環境変数の設定を見直す
  • glibc ではなく別の malloc 実装、例えば jemalloc を使う(jemalloc はメモリのフラグメンテーションに効くようです)

ただし何れにしてもトレードオフの関係があることは意識しておく必要があります。例えば MALLOC_ARENA_MAX の値を下げることでメモリ消費量は減るが、その分メモリのロックを取る確率が上がり速度が下がるなど。

私としては Puma のメモリ消費事例、スレッドごとのメモリアリーナ、jemalloc のいずれについても知らなかったことでしたので、 知ることができてよかったですし、Ruby の下で何が起こってるかについて少しだけ詳しくなり有意義な時間となりました。

Resources

最後に

毎回思うのですが RubyKaigi のクロージングはこみ上げるものがありますね。年々涙腺が弱くなっている身としては、堪えるのがだんだん辛くなってきております。 クロージングでも言われていたのでここでも言いますが、今回の RubyKaigi には仕事として参加しており、旅費周り含めてサポートもしてもらっております。

エムスリーではエンジニア仲間を募集しています!

エムスリーでは Ruby, Rails などのテクノロジーを活用して医療に貢献するエンジニアの仲間を募集中です!勉強会の見学やカジュアル面談も随時受け付けてますのでご興味があれば以下よりご応募ください!