CPU の負荷が高い処理を行うシステムを使用していますが、それはタイム クリティカルではありません。この同じシステムが RESTful エンドポイントにサービスを提供していますが、これはタイム クリティカルであり、他の処理が実行されているときにひどく行き詰まる傾向があります。優先度の高いスレッドと優先度の低いスレッドの 2 つのスレッド プールを作成して、RESTful エンドポイントが他の処理に関係なく常に高速になるようにします。
スレッドの優先順位を理解するために、この実験を作成しました。
object RunMeX extends App {
val t1 = new Thread(SlowTask("A"))
t1.setPriority(Thread.MIN_PRIORITY)
val t2 = new Thread(SlowTask("B"))
t2.setPriority(Thread.MAX_PRIORITY)
val t3 = new Thread(SlowTask("C"))
val t4 = new Thread(SlowTask("D"))
val t5 = new Thread(SlowTask("E"))
t1.start
t2.start
t3.start
t4.start
t5.start
}
case class SlowTask(label:String) extends Runnable {
def run = {
val t = Timer()
var m = scala.collection.mutable.ListBuffer[Long]()
for( i <- 0 to 100; j <- 0 to 200) {
m += i*j
val n = m.map(_+1)
}
println(label+" ::: "+t.time)
}
}
case class Timer {
val now = new java.util.Date().getTime
def time = (new java.util.Date().getTime) - now
}
優先順位を強制するために、CPU コアよりも 1 つ多いスレッドがあります。私が予想した結果は、優先度の低いスレッドが明らかに最も長くかかり、優先度の高いスレッドが明らかに最も時間がかかり、残りの 2 つはその中間にあるというものでした。私の実際の結果は、スレッド間でのパフォーマンスの違いはほとんどありませんでした。
最も優先順位の高いスレッド (つまり、ここでは t2 で表される RESTful エンドポイント処理) が常に CPU への最初/最適なアクセスを確保するにはどうすればよいですか?