Linux RedHat 5.3で、8コア(2つのクアッドコアCPU)を搭載したマシンでマルチスレッドJavaアプリを実行しています。
各スレッドのCPU使用率を、できれば取得できる最大CPUと比較して監視したいと思います(コアの1つで実行されている単一のスレッドは12.5%ではなく100%になるはずです)。
jconsole / visualVMでそれを行うことはできますか?別の(できれば無料の)ツールはありますか?
ヨアヴ
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);
}
}
}
/proc/PID/
およびの統計ファイルから推測できます/proc/PID/task/PID/
。問題は、多くのスレッドが一般的に作成され(おそらくアプリではないのですか?)、それらのタスクファイルが出入りすることです。ただし、親PIDは、すべてのプロシージャの合計スケジュール時間でユーザー/カーネル時間を報告する必要があります。したがって、ウォールクロックと比較すると、良いスタートを切ることができます。
/proc ディレクトリのトラバースなどの OS 固有の機能を使用したくない場合は、通常、ThreadMXBean.getThreadCpuTime() および ThreadMXBean.getThreadUserTime() を使用して、Java 管理インターフェースから探している値を取得できます。