メドピア開発者ブログ

集合知により医療を再発明しようと邁進しているヘルステックカンパニーのエンジニアブログです。読者に有用な情報発信ができるよう心がけたいので応援のほどよろしくお願いします。

RubyKaigi2018 速報 !! ( 6/1 - 1つ目 )

RubyKaigi2018の6/1 (2日目)の速報 (6/1 - 1つ目)です!

他の「RubyKaigi2018 速報!!」まとめ
RubyKaigi2018 速報 (5/31 1日目)!! - メドピア開発者ブログ
RubyKaigi2018 速報 !! ( 6/1 - 2つ目) - メドピア開発者ブログ
RubyKaigi2018 速報 !! ( 6/2 最終日) - メドピア開発者ブログ

RubyKaigi2018に参加中のメドピア エンジニアが、セッションの内容や感想を更新していきます。

extend your own programming language ( 6/1 13:50〜)

http://rubykaigi.org/2018/presentations/m_seki.html#jun01

for DSL

  • rubyを使ってやるよりも機能が制限されている分安全

Extend MinRuby

  • 拡張して遊ぶ!(末尾最適、rinda eval、
  • requireで自分で作成したライブラリを読み込むことが出来る。
  • 自分で演算子を追加したりも出来る。クラスの演算子をまねっこすれば簡単に出来る。
    • でもrubyに存在しない演算子を追加するのはRipperに無いので難しい。。。

感想

MinRubyを使って僕の考えた最強のRubyを作るのは楽しそう、かつ勉強になりそうでした。

Guild Prototype

new concurrency model for ruby 3 ( 6/1 13:00〜) Koichi Sasada @ko1

Guild Prototype - RubyKaigi 2018

感想

  • guildがどんなものかイメージができてよかった
  • GILから逃れられる?方法ができるのは単純にありがたい

memo

  • 2016のときはまだアイディアだったguildの進捗をお伝えします
  • マルチスレッドプログラミングは人類には早すぎた
  • motivation
    • rubyではプログラミングを簡単にしたい
    • CPUコアを有効利用したい
  • Guildのコンセプト

    • mutableなものは共有しない(raceが起こらない)
    • threadをguildに置き換える
  • 共有不可オブジェクト

    • 1つのguildにのみ所属
    • mutable objects(String ,array)
    • ruby2とcompatible
  • 共有可能オブジェクト

    • immutable objects(symbol, numeric, true, false, nil, etc)
    • Class/Moduleオブジェクト
      • 共有できないとさすがに辛い
      • C::Const = [1, 2, 3]みたいなのは特別扱い
    • special mutable objects
      • Shared hash, array
      • Guild objects
      • 変更するには同期が必須
    • Isolated Proc
      • 外のmutableな変数にアクセスできない
  • 40 virtual CPUのマシンでデモ

    • fib(23)を100000回
      • 早くなるに決まっています
      • fib(10)くらいだとあまり変わらない
    • File.read(file).b.upcase.split(/\W/).uniq.size
      • Guildが増えると遅くなる
        • GC/object allocationでロックが発生する
  • GIL(Giant Interpreter Lock)がguildごとに適用される?

    • GGL(Giant Guild Lock)
  • Guild間通信

    • Actor model, send/receive semantics
      • Guild.parent << 'hoge'
      • hoge = Guild.receive
    • Guild間で共有不可オブジェクトを受け渡すときはコピーするか移動する
  • 実装

    • VM -> 1+ Guilds (NEW!) -> 1+ Threads -> 1+ Fibers
    • GCは全Guildを止める(Guildの中のスレッドも)
  • Guildという名前はmembershipを意識している

    • ただしまだコードネーム扱い

Improve Ruby coding style rules and Lint ( 6/1 13:00〜)

http://rubykaigi.org/2018/presentations/koic.html#jun01

スライド:

speakerdeck.com

LintとStyle違い

  • Style
    • いろいろなスタイルガイドがあるがrubocopのdefaultはRubyStyleGuide
    • それは正解不正解ではなく、文化の違いのためRubocopを変更するのはいいこと。
  • Lint
    • Lintはバグとなり得るもの。
    • ERB.newが2.6でキーワード引数で呼び出すように変更となったものを取り込んだりしている。
    • ruby -woptionでも検知出来るものもあるが、rubocopの方が検証範囲を細かく設定できるため、かゆいところに手が届く。

実際の業務からrubocopにつなげる

  • 実際に現場で発生したバッドケースをCopとして定義している。
  • それが他の人に役に立つ。

他のOSSからrubocopにつなげる

  • railsのrubocop.ymlは基本的にすべてfalseにして、有効にしたいものだけtrueとする運用としている。
  • railsのminitestのcopをrubocopのrails部署に置き換えることを行った。
    • railsの新機能のcopが集まってきたりするようになった!

It's Rubies All The Way Down ( 6/1 10:50〜)

http://rubykaigi.org/2018/presentations/wyhaines.html#jun01

  • アプリケーション(rails等)、環境構築(itamae等)、デプロイ(capistrano等)、ロガー(Fluentd等)等のRubyで実現されている様々な機能
  • Rubyで作られたKey/Value Storeがあるの知らなかった・・・! https://roma-kvs.org/

Faster Apps, No Memory Thrash: Get Your Memory Config Right ( 6/1 10:50〜)

github: noahgibbs Noah Gibbs @codefolio

Faster Apps, No Memory Thrash: Get Your Memory Config Right - RubyKaigi 2018

スライド:

docs.google.com

感想

  • 他でも良いという話は聞くのでjemallocは一度試してみたい

memo

ruby memory system

  • tiny objects
    • no memory allocations
  • small objects
    • 40-byte slot
    • 408 slots / page
  • big objects
    • slotに入らない

GC

  • generational
    • major GC
      • 全部チェック
      • GC.start
    • minor GC
      • 新しいのだけチェック
      • GC.start(full_mark: false)
  • mark/sweep

GC cycle: grow, collect, expand

問題: garbageが増えると遅くなる

省ける無駄は省く destrictive ops (gsub!, concat)はやさしい

質疑 Q) immutableなデータ使いたいんだけど? A) といっても、immutabilityを利用した最適化はrubyでは難しいから…

GC.stat useful parts - heap__available__slots, heap__live__slots, heal__free_slots - major__gc__count, minor__gc__count

環境変数 - RUBYGCHEAPINITSLOTS - RUBYGCHEAPFREESLOTSGOALRATIL - RUBYGCMALLOCLIMIT - RUBYGCOLDMALLOCLIMIT

適切な環境変数により、startup timeを改善できる

EnvMem: A Memory Tool

gem install env_mem

crubyはwarmupに時間がかかるが、EnvMemを使ってみたらwarmupの影響がなかった

Allocators

なんか難しいんだけど、簡単に早くなるものはないの? => YES!

mallocの代替 → jemalloc

linuxだったら特にjemalloc良い

./configure --with-jemalloc RUBY_CONFIGURE_OPTS="--with-jemalloc" rbenv install ...

10-12% speedup

まとめ what helps?

  • LESS WASTE
  • Good Env variable
  • jemalloc
  • latest ruby

その他

Slotは動かしづらい → fragmentation

GC::Profiler

GC::Profiler.enable

...

puts GC::Profiler.report

(☝︎ ՞ਊ ՞)☝︎是非読者になってください


メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!

■募集ポジションはこちら

https://medpeer.co.jp/recruit/entry/

■開発環境はこちら

https://medpeer.co.jp/recruit/workplace/development.html