2013-09-21 36 views
0

我有一個系統具有CPU昂貴的處理,但這不是時間關鍵。這個系統正在爲RESTful端點提供服務,這些端點對時間要求很高,並且在其他處理運行時往往會嚴重受阻。我想創建兩個線程池,一個具有高優先級線程,另一個具有低優先級,這樣無論其他處理如何,RESTful端點總是會很快。如何確保最高優先級的線程具有對CPU的最佳/最佳訪問?

我創造了這個實驗,試圖瞭解線程的優先級:

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 預計爲是低優先級的線程,顯然需要最長的時間,高優先級的線程明顯佔用最少的時間,剩下的兩個線程則處於中間的某個位置。我的實際結果顯示線程之間在性能上幾乎沒有什麼區別。

如何確保我的最高優先級線程(即,此處由t2表示的RESTful端點處理)始終具有對CPU的最佳/最佳訪問權限?

回答

2

通常,在延遲優化工作負載(您的REST API)以及吞吐量優化工作負載(您的CPU密集型工作)中使用相同的JVM並不是一個好主意。以特定於您的工作負載類型的方式調整垃圾回收很困難。更簡單和更小的JVM將更具可預測性。

針對您的問題,確保您通過-XX:+UseThreadPriorities標誌,如here所述,並在Linux上以root身份運行該應用程序。