0

我有一个系统具有 CPU 昂贵的处理能力,但这不是时间关键的。同样的系统正在为 RESTful 端点提供服务,这些端点对时间要求很高,并且在其他处理运行时往往会严重陷入困境。我想创建两个线程池,一个具有高优先级线程,另一个具有低优先级,这样无论其他处理如何,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 内核多一个,以强制确定优先级。我期望的输出是低优先级线程显然花费的时间最长,高优先级线程显然花费的时间最少,剩下的两个线程在中间的某个地方。我的实际结果显示线程之间的性能几乎没有差别。

如何确保我的最高优先级线程(即 RESTful 端点处理,此处由 t2 表示)始终具有对 CPU 的第一/最佳访问权限?

4

1 回答 1

2

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

具体到您的问题,请确保您按照此处-XX:+UseThreadPriorities所述传递标志,并在 Linux 上以 root 身份运行应用程序。

于 2013-09-21T16:50:10.233 回答