From 734f76a0d188622e860b0a94fc8e7581b97a632c Mon Sep 17 00:00:00 2001 From: Eric Long Date: Tue, 29 Nov 2022 14:26:12 -0500 Subject: [PATCH] 0005606: CPU monitor top threads should ignore threads waiting on I/O --- .../monitor/AbstractMonitorType.java | 2 +- .../symmetric/monitor/MonitorTypeCpu.java | 29 +++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/monitor/AbstractMonitorType.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/monitor/AbstractMonitorType.java index 7c8054cc3e..db37b76999 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/monitor/AbstractMonitorType.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/monitor/AbstractMonitorType.java @@ -44,7 +44,7 @@ public void setSymmetricEngine(ISymmetricEngine engine) { protected void rankTopUsage(ThreadInfo infos[], long usages[], ThreadInfo info, long usage) { for (int i = 0; i < infos.length; i++) { if (usage > usages[i]) { - for (int j = i + 1; j < infos.length; j++) { + for (int j = infos.length - 1; j > i; j--) { infos[j] = infos[j - 1]; usages[j] = usages[j - 1]; } diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/monitor/MonitorTypeCpu.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/monitor/MonitorTypeCpu.java index d013fc1ba6..2c93ba39c7 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/monitor/MonitorTypeCpu.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/monitor/MonitorTypeCpu.java @@ -26,6 +26,8 @@ import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; import org.jumpmind.extension.IBuiltInExtensionPoint; import org.jumpmind.symmetric.model.Monitor; @@ -34,10 +36,19 @@ public class MonitorTypeCpu extends AbstractMonitorType implements IBuiltInExtensionPoint { protected OperatingSystemMXBean osBean; protected RuntimeMXBean runtimeBean; + protected List ignoreElements; public MonitorTypeCpu() { osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); runtimeBean = ManagementFactory.getRuntimeMXBean(); + ignoreElements = new ArrayList(); + ignoreElements.add(new StackTraceElement("java.lang.Object", "wait", null, 0)); + ignoreElements.add(new StackTraceElement("sun.misc.Unsafe", "park", null, 0)); + ignoreElements.add(new StackTraceElement("sun.nio.ch.EPollArrayWrapper", "epollWait", null, 0)); + ignoreElements.add(new StackTraceElement("java.lang.Thread", "sleep", null, 0)); + ignoreElements.add(new StackTraceElement("sun.management.ThreadImpl", "getThreadInfo1", null, 0)); + ignoreElements.add(new StackTraceElement("sun.nio.ch.ServerSocketChannelImpl", "accept", null, 0)); + ignoreElements.add(new StackTraceElement("sun.nio.ch.ServerSocketChannelImpl", "accept0", null, 0)); } @Override @@ -89,15 +100,27 @@ protected String getNotificationMessage(long value, long threshold, long period) long cpuUsages[] = new long[TOP_THREADS]; ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); for (long threadId : threadBean.getAllThreadIds()) { - ThreadInfo info = threadBean.getThreadInfo(threadId); + ThreadInfo info = threadBean.getThreadInfo(threadId, 1); if (info != null) { if (info.getThreadState() != Thread.State.TERMINATED) { - rankTopUsage(infos, cpuUsages, info, threadBean.getThreadCpuTime(threadId)); + StackTraceElement[] trace = info.getStackTrace(); + boolean ignore = false; + if (trace != null && trace.length > 0) { + for (StackTraceElement element : ignoreElements) { + if (trace[0].getClassName().equals(element.getClassName()) && trace[0].getMethodName().equals(element.getMethodName())) { + ignore = true; + break; + } + } + } + if (!ignore) { + rankTopUsage(infos, cpuUsages, info, threadBean.getThreadCpuTime(threadId)); + } } } } StringBuilder text = new StringBuilder("CPU usage is at "); - text.append(value).append(System.lineSeparator()).append(System.lineSeparator()); + text.append(value).append("%").append(System.lineSeparator()).append(System.lineSeparator()); for (int i = 0; i < infos.length; i++) { if (infos[i] != null) { text.append("Top #").append((i + 1)).append(" CPU thread ").append(infos[i].getThreadName())