Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Mastodon on Ruby master S.H.
Slide 2
Slide 2 text
自己紹介 S.H. Rubyにたまにパッチを投げてる人 2017年ごろから鯖缶やってる人 最近ActivityPubリレーサーバを自作した
Slide 3
Slide 3 text
Rubyの コントリビューター
Slide 4
Slide 4 text
Mastodonの鯖缶
Slide 5
Slide 5 text
今日話すこと Ruby masterについて 実際の運用方法 バグの事例
Slide 6
Slide 6 text
Ruby masterについて
Slide 7
Slide 7 text
Ruby master とは? ruby/ruby リポジトリのmasterブランチのこと つまりRubyの開発版 rbenv などのバージョン管理ツールで使える 公式の rubylang/ruby イメージ経由でも使 える
Slide 8
Slide 8 text
Ruby master を使うメリット 新機能をいち早く試せる パフォーマンス改善の恩恵を受けられる バグを踏める コントリビューションチャンスがある
Slide 9
Slide 9 text
Ruby master を使うデメリット バグを踏むことがある バグを踏んだときは自力でどうにかするしかな い デバッグとかつらい
Slide 10
Slide 10 text
利用状況や安定性 Shopify や GitHub でも利用されている コミッター(開発者)がそれらの企業にいるため バグも修正されやすい 基本的に安定している バグを踏んでも少し待てば修正されることが多 い
Slide 11
Slide 11 text
弊鯖での利用バージョン Ruby 3.4-dev(hash) jemalloc(アロケーションの改善) Universal Parser(パーサー周りの設定) YJIT(パフォーマンス改善) M:N Thread(軽量な並行処理の改善)
Slide 12
Slide 12 text
実際の運用方法
Slide 13
Slide 13 text
MastodonでRuby masterを使う RubyのバージョンやGemfile、CI の修正が必 要 デプロイ時にRuby masterをビルド それ以外は基本的に必要な変更はない
Slide 14
Slide 14 text
Rubyのバージョン変更 .ruby-versionをruby-dev に変更 - 3.3.6 + ruby-dev
Slide 15
Slide 15 text
Gemfileの変更 bundled_gem になった gem を追加 一部のgemは特定のコミットに変更 + gem 'rexml', '~> 3.2' - gem 'pg', '~> 1.5' + gem 'pg', github: 'ged/ruby-pg', ref: 'd072b218'
Slide 16
Slide 16 text
CIの修正 GitHub Actions にruby-devを追加 strategy: fail-fast: false matrix: ruby-version: - '3.2' - '3.3' + - 'head'
Slide 17
Slide 17 text
デプロイ時のビルド rbenvを使ってRuby masterをビルド jemallocやYJITなどをオプションで有効化 ビルド時のログも出力し、バグや警告も確認
Slide 18
Slide 18 text
実際のビルドコマンド RUBY_CONFIGURE_OPTS=" \ --with-jemalloc \ --enable-yjit \ cppflags=-DUNIVERSAL_PARSER \ " \ rbenv install ruby-dev --verbose
Slide 19
Slide 19 text
バグを踏んだ時 本番環境のログを確認 ローカル環境で再現手順を作製 パッチを投げる パッチが難しい場合は、Ruby 3.2 か 3.3へダ ウングレードして解消
Slide 20
Slide 20 text
バグの事例
Slide 21
Slide 21 text
RDocがビルドできない(1) Ruby masterでRDocがインストールできない Generating RDoc documentation Parsing sources... double free or corruption (!prev) Aborted make: *** [uncommon.mk:676: rdoc] Error 134
Slide 22
Slide 22 text
RDocがビルドできない(2) どうもメモリ周りの問題らしい double free or corruption (!prev) Aborted make: *** [uncommon.mk:676: rdoc] Error 134
Slide 23
Slide 23 text
調査(1) ログからメモリ周りの問題であることは判明 オプションのオンオフを試す
Slide 24
Slide 24 text
調査(2) -DUNIVERSAL_PARSER が有効な場合の み再現 直近の変更を確認し、各コミット毎にビルドを試 す
Slide 25
Slide 25 text
調査(3) [Feature #20257] Rearchitect Ripper これがマージされて以降に発生していることが分 かった
Slide 26
Slide 26 text
調査(4) RipperとRDocのコードを読み最小の再現コー ドを作成 require 'ripper' Ripper.new("./array.rb")
Slide 27
Slide 27 text
調査結果 RipperとPaserのメモリアロケーション関数が 同じ関数を使っている Universal Parserを有効化した際にCの translation unitで構造体のアロケーションさ れるサイズが異なっていた
Slide 28
Slide 28 text
パッチ作成(1) RipperとPaserそれぞれでアロケーションされ るサイズを調整 再現コードでエラーにならないことを確認
Slide 29
Slide 29 text
パッチ作成(2)
Slide 30
Slide 30 text
パッチ作成(3) レビューで「アロケーション周りの関数を共有し ているのをやめ、分離してはどうか?」とコメント を頂いた そのほうが後々も楽そうなので分離する方向で 対応し、無事マージされた
Slide 31
Slide 31 text
まとめ Ruby masterでMastodon を動かすことはで きる バグを踏むこともあるけどコントリビューション チャンスでもあるので楽しい