私の Ruby アプリケーションは、それぞれの実行に約 10 秒かかるジョブを処理します。各ジョブは、IO の待機に多くの時間を費やします。単純な Time.now 比較を使用して、ジョブの各段階にかかる時間を記録するタイマーがあります。
def timer
t = Time.now
yield
(Time.now - t).seconds
end
timer do
# IO
end
=> 1.342
もともと、すべてのジョブを順番に処理していましたが、マシンが 50% の時間 (IO のために) アイドル状態だったことを除けば、これは素晴らしいことでした。
IO 時間を取り戻すために、マルチスレッド モデルに移行しました。ここで、最大 10 の同時スレッドまで、ジョブごとに新しいスレッドを生成します。これはうまく機能しますが、タイマー ブロックの実行中にスレッドがプリエンプトされると、スレッドがスリープしている間もタイマーが「実行」され続け、タイマーが人為的に膨らんだ数値を返すことになります。
私が必要としているのは、スリープに費やした時間を無視して、タイマー ブロックの実際の実行時間を把握する方法です。Thread.current に実行に費やした時間を尋ねるなど、これを達成する方法はありますか?