萌えハッカーニュースリーダー

2025/05/19 15:10 SDB Scans the Ruby Stack Without the GVL

出典: https://github.com/yfractal/blog/blob/master/blog/2025-01-15-non-blocking-stack-profiler.md
博士
???

ロボ子、今日はRubyのスタックプロファイリングに関する面白いニュースがあるのじゃ!

ロボ子
???

それは興味深いですね、博士。どのような内容でしょうか?

博士
???

SDBという新しい手法が出てきたみたいでな、RubyのスタックをGVLなしでスキャンできるらしいぞ。

ロボ子
???

GVLなしでスキャンですか?それはすごいですね。従来のRubyスタックプロファイラはGVLに依存していたんですよね?

博士
???

そうそう。GVLがあると、スタックのスキャン中にアプリケーションがブロックされて、遅延が発生してしまうのじゃ。

ロボ子
???

なるほど。Rbspyの非同期モードもGVLなしでアクセスしようとしてエラーが起きていたと。

博士
???

SDBは、アトミックなデータアクセスを利用して、GVLなしで安全にRubyスタックをスキャンするらしいぞ。例えば、64ビットアラインされたデータはアトミックに更新されるから、安全に読み取れるのじゃ。

ロボ子
???

アトミックなデータアクセスですか。確かにそれなら競合を避けられますね。

博士
???

さらに、Rubyスレッドのライフサイクルにフックして、スレッドが再利用される前にスキャンを停止させることで安全性を確保しているらしいぞ。

ロボ子
???

そこまで考慮されているとは、すごいですね。

博士
???

シンボル化も工夫されているみたいでな。eBPFを使ってISeqの作成イベントをキャプチャして、オフラインプログラムでアドレスをシンボルに変換するらしいぞ。

ロボ子
???

eBPFですか。最近よく耳にしますね。メモリコンパクションにも対応するために、eBPFでメモリコンパクションイベントもキャプチャするというのは、すごいですね。

博士
???

データ競合のリスクを管理するために、楽観的並行性制御に世代番号を使用しているらしいぞ。スタックがプッシュされるたびに世代番号をインクリメントして、スキャンの前後にこの番号をチェックするのじゃ。

ロボ子
???

世代番号を使ってデータ競合をチェックするとは、賢いですね。

博士
???

SDBは、高速なスタックスキャンと正確なレイテンシ測定を実現して、常時オンのスタックプロファイラを可能にするらしいぞ。追加の並行性技術も使用しているみたいじゃな。

ロボ子
???

SDBはまだ開発中とのことですが、今後の発展が楽しみですね。

博士
???

ほんとじゃな。しかし、GVLなしでRubyのスタックをスキャンするなんて、まるで私がロボ子なしでコーヒーを淹れるようなものじゃ。不可能ではないけど、ちょっと不安なのじゃ。

ロボ子
???

博士、私はコーヒーメーカーではありませんよ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search