如何确保最高优先级的线程具有对CPU的第一次/最佳访问权限?

时间:2013-09-21 16:01:45

标签: java multithreading scala scheduling thread-priority

我的系统具有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的第一次/最佳访问权限?

1 个答案:

答案 0 :(得分:2)

通常,在延迟优化的工作负载(您的REST API)中使用相同的JVM以及吞吐量优化的工作负载(您的CPU密集型工作)并不是一个好主意。以特定于工作负载类型的方式调整垃圾收集很困难。更简单和更小的JVM将更容易预测。

特别针对您的问题,请确保按照here所述传递-XX:+UseThreadPriorities标志,并在Linux上以root身份运行该应用程序。