Rubyのスレッド競合:乱闘ではない

2025-02-03

長い間、Rubyにおける「スレッド競合」を誤解していました。それは混沌とした争いではなく、Rubyのスレッドはグローバル仮想マシンロック(GVL)を取得するためにきちんとキューイングします。各スレッドはGVLを取得し、コードを実行し、その後解放するか、一定時間(スレッドのクォンタム、デフォルト100ms)後にプリエンプションされます。これは、スレッドがI/Oを実行するか、クォンタムより長く実行された場合に発生します。これを理解することは、マルチスレッドアプリケーションの最適化、特にCPUバウンドスレッドがI/Oバウンドスレッドをブロックしてテールレイテンシが増加するのを防ぐために不可欠です。CPUバウンドスレッドの優先順位を下げるか、スレッドクォンタムを減らすことで対応できますが、最小スライスは10msです。

開発