如何在linux多处理器环境中监控java应用程序的每个线程的cpu使用情况?

时间:2009-11-05 14:19:39

标签: java profiling multicore monitor

我在Linux RedHat 5.3上运行一个多线程的Java应用程序,该机器有8个内核(2个四核cpu)。

我想监视每个线程的cpu使用情况,最好是相对于它可以获得的最大cpu(在1个核心上运行的单个线程应该达到100%而不是12.5%)。

我可以使用jconsole / visualVM吗? 还有另一种(希望是免费的)工具吗?

约阿夫

3 个答案:

答案 0 :(得分:2)

您可以从/proc/PID//proc/PID/task/PID/中的统计信息进行推断。问题是通常会创建大量线程(可能不是您的应用程序?),这些任务文件会来来去去。但是,父PID应该在所有触发上的总预定时间内报告用户/内核时间,因此与wallclock进行比较应该会给你一个良好的开端。

答案 1 :(得分:2)

如果您不想使用特定于操作系统的功能(如遍历/ proc目录),通常可以使用ThreadMXBean.getThreadCpuTime()和ThreadMXBean.getThreadUserTime()从Java管理界面获取您要查找的值。

答案 2 :(得分: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);
        }
    }
}