SmartHR最大のRailsアプリケーションにおけるPumaスレッド数を見直しました
・GVL
ネイティブスレッドを用いて実装されていますが、現在の実装では Ruby VM は Giant VM lock (GVL) を有しており、同時に実行されるネイティブスレッドは常にひとつです。ただし、IO 関連のブロックする可能性があるシステムコールを行う場合には GVL を解放します。
むずい
Rubyアプリケーションでスレッドを作成すると、Ruby VMはそれらのスレッドをOSのスレッドと1対1で一致させます
・pumaを大量に起動してもスレッド間でGVLの取り合いになる
・I/Oの間であればGVLが解放される→I/O比率でスレッド数制御すればええやんという話らしい