我的系统具有CPU昂贵的处理能力,但这不是时间关键的。同一系统正在为RESTful端点提供服务,这些端点对时间要求严格,并且在其他处理运行时往往会严重陷入困境。我想创建两个线程池,一个具有高优先级线程,另一个具有低优先级,因此无论其他处理如何,RESTful端点始终都是快速的。
我创建了这个实验,试图理解Thread优先级:
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核心更多的线程,强制一些优先级。输出I 期望是低优先级的线程,显然需要最长的,高优先级的线程显然占用最少的时间,剩下的两个在中间的某个地方。我的实际结果表明,线程之间的性能差别不大。
如何确保我的最高优先级线程(即REST在此处以t2表示的端点处理)始终具有对CPU的第一次/最佳访问权限?
答案 0 :(得分:2)
通常,在延迟优化的工作负载(您的REST API)中使用相同的JVM以及吞吐量优化的工作负载(您的CPU密集型工作)并不是一个好主意。以特定于工作负载类型的方式调整垃圾收集很困难。更简单和更小的JVM将更容易预测。
特别针对您的问题,请确保按照here所述传递-XX:+UseThreadPriorities
标志,并在Linux上以root身份运行该应用程序。