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
- 最小限の機能を持つMinRubyを改造して、自分のrubyを作っていく話
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でロックが発生する
- Guildが増えると遅くなる
- fib(23)を100000回
GIL(Giant Interpreter Lock)がguildごとに適用される?
- GGL(Giant Guild Lock)
Guild間通信
- Actor model, send/receive semantics
Guild.parent << 'hoge'
hoge = Guild.receive
- Guild間で共有不可オブジェクトを受け渡すときはコピーするか移動する
- Actor model, send/receive semantics
実装
- 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
スライド:
LintとStyle違い
- Style
- いろいろなスタイルガイドがあるがrubocopのdefaultはRubyStyleGuide
- それは正解不正解ではなく、文化の違いのためRubocopを変更するのはいいこと。
- Lint
- Lintはバグとなり得るもの。
- ERB.newが2.6でキーワード引数で呼び出すように変更となったものを取り込んだりしている。
ruby -w
optionでも検知出来るものもあるが、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
スライド:
感想
- 他でも良いという話は聞くので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)
- major GC
- 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/
■開発環境はこちら