【问题标题】:How to ensure highest-priority thread has first/best access to CPU?如何确保最高优先级的线程首先/最好地访问 CPU?
【发布时间】:2013-09-21 16:01:45
【问题描述】:

我有一个处理 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 的第一/最佳访问权限?

【问题讨论】:

    标签: java multithreading scala scheduling thread-priority


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2014-11-26
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多