2009-11-05 55 views
2

我在具有8個內核(2個四核CPU)的機器上在Linux RedHat 5.3中運行多線程Java應用程序。如何監控linux多處理器環境中java應用程序的每個線程的CPU使用情況?

我想監視每個線程的CPU使用情況,最好是相對於它可以獲得的最大CPU(在一個內核上運行的單個線程應該高達100%而不是12.5%)。

我可以使用jconsole/visualVM嗎? 有沒有另一種(希望免費)的工具?

約阿夫

回答

2

如果您不想使用操作系統特定的函數(例如遍歷/ proc目錄),那麼通常可以使用ThreadMXBean.getThreadCpuTime()和ThreadMXBean.getThreadUserTime()從Java管理界面獲取要查找的值。 。

2

您可以從統計文件/proc/PID//proc/PID/task/PID/推斷。問題是通常會創建大量線程(可能不適用於您的應用程序?),並且這些任務文件將會出現並消失。然而,家長PID應該在所有特效的總計劃時間內報告用戶/內核時間,因此與wallclock進行比較應該會給你一個好的開始。

2

由於jarnbjo回答,您可以查詢線程管理JMX的Bean的線程的CPU和用戶時間:

import static org.junit.Assert.assertTrue; 

import java.lang.management.ManagementFactory; 
import java.lang.management.ThreadInfo; 
import java.lang.management.ThreadMXBean; 

import org.junit.Test; 

public class ThreadStatsTest { 

    @Test 
    public void testThreadStats() throws Exception { 
     ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); 
     assertTrue(threadMXBean.isThreadCpuTimeSupported()); 
     assertTrue(threadMXBean.isCurrentThreadCpuTimeSupported()); 

     threadMXBean.setThreadContentionMonitoringEnabled(true); 
     threadMXBean.setThreadCpuTimeEnabled(true); 
     assertTrue(threadMXBean.isThreadCpuTimeEnabled()); 

     ThreadInfo[] threadInfo = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds()); 
     for (ThreadInfo threadInfo2 : threadInfo) { 
      long blockedTime = threadInfo2.getBlockedTime(); 
      long waitedTime = threadInfo2.getWaitedTime(); 
      long cpuTime = threadMXBean.getThreadCpuTime(threadInfo2.getThreadId()); 
      long userTime = threadMXBean.getThreadUserTime(threadInfo2.getThreadId()); 

      String msg = String.format(
        "%s: %d ns cpu time, %d ns user time, blocked for %d ms, waited %d ms", 
        threadInfo2.getThreadName(), cpuTime, userTime, blockedTime, waitedTime); 
      System.out.println(msg); 
     } 
    } 
} 
相關問題