2

Linux RedHat 5.3で、8コア(2つのクアッドコアCPU)を搭載したマシンでマルチスレッドJavaアプリを実行しています。

各スレッドのCPU使用率を、できれば取得できる最大CPUと比較して監視したいと思います(コアの1つで実行されている単一のスレッドは12.5%ではなく100%になるはずです)。

jconsole / visualVMでそれを行うことはできますか?別の(できれば無料の)ツールはありますか?

ヨアヴ

4

3 に答える 3

3

jarnbjo が答えたように、スレッドの CPU とユーザー時間についてスレッド管理 JMX Bean を照会できます。

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は、すべてのプロシージャの合計スケジュール時間でユーザー/カーネル時間を報告する必要があります。したがって、ウォールクロックと比較すると、良いスタートを切ることができます。

于 2009-11-05T14:24:04.517 に答える
2

/proc ディレクトリのトラバースなどの OS 固有の機能を使用したくない場合は、通常、ThreadMXBean.getThreadCpuTime() および ThreadMXBean.getThreadUserTime() を使用して、Java 管理インターフェースから探している値を取得できます。

于 2009-11-05T14:45:51.990 に答える