【问题标题】:How can I Monitor cpu usage per thread of a java application in a linux multiprocessor environment?如何在 linux 多处理器环境中监控 java 应用程序的每个线程的 cpu 使用情况?
【发布时间】:2010-12-13 10:40:19
【问题描述】:

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

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

我可以用 jconsole/visualVM 来做吗? 还有其他(希望是免费的)工具吗?

约夫

【问题讨论】:

    标签: java profiling multicore monitor


    【解决方案1】:

    正如 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);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2010-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-08
          • 1970-01-01
          • 2016-02-19
          • 1970-01-01
          相关资源
          最近更新 更多