RubyKaigi 2022 Day 2 How fast really is Ruby 3.x?
Ruby3をRuby2の3倍速くするという目標
過去のトークとどう違うのか?
過去のトークではRailsからの話が多かった
Railsとは違った視点で広く使われているRubyアプリであるfluentdについて話したい
YJITも試してみる
fluentd
Pure ruby log collector
Nginx access log -> Elasticsearch and/or PostgreSQL
fluentdは大量のRubyオブジェクトを扱う
一日で4億~10億のログを処理しているというissueコメント
更に多いユーザーもいる
一行=一オブジェクト
一時間あたり数十万オブジェクト
Railsで一倍遅いボトルネック
DBやHTTP
Railsでは、Rubyは実は他のシステムコンポーネントを待ってるだけの時間が多い
Ruby3x3で3倍速くなったとしてもRailsが3倍速くなることはない
fluentdはRubyを同梱したパッケージとしてリリースしている
2014
td-agent v1.1.21
Ruby v1.9.3
2017
td-agent v2.3.6
2020
td-agent v3.8.0
2022
td-agent v4.4.1
2023
td-agent v4.4.1
1000万行のNginx logとLTSV -> Read lines -> Parse lines -> Emit -> Count
LTSV
徐々に速くなっていっている
Ruby v
1.9.3
8.5万行/s
2.1.10
10万行/s
2.4.10
2.7.6
19万行/s
3.1.2
3.2.0
3.2.0+yjit
26万行/s
1.9.3と3.2.0+yjitだと3倍速くなっている
Nginx log
2.5倍くらいになっている
https://gyazo.com/ab509ab615954e09eaf92b11eebdc8c3
Ruby 3 will be 3 times faster than Ruby 2.
I'm actually not sure how to make it happen,
but I have set the goal anyway so that we can start thinking how to archive it.
Ruby3はRuby2の3倍速くなる
どうしたら3倍速くなるのか知らないけど、3倍速くする方法を考えよう!
Ruby vs Python vs Lua vs Perl
ロジックはほとんど同じコードでLTSVをパースさせてみる
Ruby3
37万行/s
Ruby3 + YJIT
39万行/s
Lua
40万行/s
Perl
51万行/s
Python
70万行/s
LuaJIT
100万行/s
https://gyazo.com/bb317e012246c90b17b375d0d2e3f166
Ruby 3.xはRuby 3.0の3倍速くしよう!
Python
シャノンプラン
Pythonを爆速にする計画
まとめ
Ruby3x3
fluentdによるベンチマークでは確かに達成されていることを確認
他の言語と比較するとまだ遅い
Ruby 3.xでさらに3倍速くなるといいな
Ruby 3
ほぼほぼ移行できる
ハマりポイント
rb_funcall
FileUtils.rm
fluentdで
enable_jitを使えるようになる
来年3月、fluentd v3.3リリース予定
fluentdではまだ使いこなせていない
Ractorを使うとオブジェクト共有できなくなる
fluentdでは各クラスがオブジェクトを共有している