我在具有8個內核(2個四核CPU)的機器上在Linux RedHat 5.3中運行多線程Java應用程序。如何監控linux多處理器環境中java應用程序的每個線程的CPU使用情況?
我想監視每個線程的CPU使用情況,最好是相對於它可以獲得的最大CPU(在一個內核上運行的單個線程應該高達100%而不是12.5%)。
我可以使用jconsole/visualVM嗎? 有沒有另一種(希望免費)的工具?
約阿夫
我在具有8個內核(2個四核CPU)的機器上在Linux RedHat 5.3中運行多線程Java應用程序。如何監控linux多處理器環境中java應用程序的每個線程的CPU使用情況?
我想監視每個線程的CPU使用情況,最好是相對於它可以獲得的最大CPU(在一個內核上運行的單個線程應該高達100%而不是12.5%)。
我可以使用jconsole/visualVM嗎? 有沒有另一種(希望免費)的工具?
約阿夫
如果您不想使用操作系統特定的函數(例如遍歷/ proc目錄),那麼通常可以使用ThreadMXBean.getThreadCpuTime()和ThreadMXBean.getThreadUserTime()從Java管理界面獲取要查找的值。 。
您可以從統計文件/proc/PID/
和/proc/PID/task/PID/
推斷。問題是通常會創建大量線程(可能不適用於您的應用程序?),並且這些任務文件將會出現並消失。然而,家長PID應該在所有特效的總計劃時間內報告用戶/內核時間,因此與wallclock進行比較應該會給你一個好的開始。
由於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);
}
}
}