2009-11-05 58 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); 
     } 
    } 
} 
相关问题