2

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

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

我可以用 jconsole/visualVM 来做吗?是否有另一个(希望是免费的)工具?

约夫

4

3 回答 3

3

正如 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);
        }
    }
}
于 2009-11-05T14:57:45.790 回答
2

/proc/PID/您可以从和中的统计文件推断/proc/PID/task/PID/。问题是通常会创建很多线程(可能不是您的应用程序?)并且这些任务文件会来来去去。然而,父 PID 应该报告所有 procs 的总计划时间中的用户/内核时间,因此与挂钟进行比较应该会给你一个好的开始。

于 2009-11-05T14:24:04.517 回答
2

如果您不想使用特定于操作系统的函数(例如遍历 /proc 目录),通常可以使用 ThreadMXBean.getThreadCpuTime() 和 ThreadMXBean.getThreadUserTime() 从 Java 管理接口中获取所需的值。

于 2009-11-05T14:45:51.990 回答