This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push: new 0a6bb54e47d branch-2.1: [opt](metrics) optimize performance of metrics endpoint #49380 (#49455) 0a6bb54e47d is described below commit 0a6bb54e47dbf66e47b61b4ee55c8b3bb6d24910 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> AuthorDate: Wed Mar 26 11:31:06 2025 +0800 branch-2.1: [opt](metrics) optimize performance of metrics endpoint #49380 (#49455) Cherry-picked from #49380 Co-authored-by: 924060929 <lanhuaj...@selectdb.com> --- .../org/apache/doris/monitor/jvm/JvmService.java | 6 +--- .../org/apache/doris/monitor/jvm/JvmStats.java | 42 ++++++++++++++++++++-- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmService.java b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmService.java index a46443925de..01184cd3cd3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmService.java +++ b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmService.java @@ -38,11 +38,8 @@ public class JvmService { private final JvmInfo jvmInfo; - private JvmStats jvmStats; - public JvmService() { this.jvmInfo = JvmInfo.jvmInfo(); - this.jvmStats = JvmStats.jvmStats(); } public JvmInfo info() { @@ -50,8 +47,7 @@ public class JvmService { } public synchronized JvmStats stats() { - jvmStats = JvmStats.jvmStats(); - return jvmStats; + return JvmStats.jvmStats(); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java index d3c16bb6c58..fba1aa489d6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java +++ b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java @@ -17,9 +17,13 @@ package org.apache.doris.monitor.jvm; +import org.apache.doris.common.util.JdkUtils; import org.apache.doris.monitor.unit.ByteSizeValue; import org.apache.doris.monitor.unit.TimeValue; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import java.lang.management.BufferPoolMXBean; import java.lang.management.ClassLoadingMXBean; import java.lang.management.GarbageCollectorMXBean; @@ -30,6 +34,7 @@ import java.lang.management.MemoryUsage; import java.lang.management.RuntimeMXBean; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -38,17 +43,35 @@ import java.util.List; import java.util.concurrent.TimeUnit; public class JvmStats { - + private static final Logger LOG = LogManager.getLogger(JvmStats.class); private static final RuntimeMXBean runtimeMXBean; private static final MemoryMXBean memoryMXBean; private static final ThreadMXBean threadMXBean; private static final ClassLoadingMXBean classLoadingMXBean; + private static final Method dumpThreadInfos; + static { runtimeMXBean = ManagementFactory.getRuntimeMXBean(); memoryMXBean = ManagementFactory.getMemoryMXBean(); threadMXBean = ManagementFactory.getThreadMXBean(); classLoadingMXBean = ManagementFactory.getClassLoadingMXBean(); + dumpThreadInfos = getDumpThreadInfosMethod(); + } + + private static Method getDumpThreadInfosMethod() { + try { + String javaRuntimeVersionStr = System.getProperty("java.version"); + int javaVersionAsInteger = JdkUtils.getJavaVersionAsInteger(javaRuntimeVersionStr); + if (javaVersionAsInteger >= 10) { + return ThreadMXBean.class.getDeclaredMethod( + "dumpAllThreads", boolean.class, boolean.class, int.class + ); + } + } catch (Throwable t) { + LOG.warn("failed to get jdk version, ignore it", t); + } + return null; } public static JvmStats jvmStats() { @@ -90,8 +113,8 @@ public class JvmStats { int threadsWaiting = 0; int threadsTimedWaiting = 0; int threadsTerminated = 0; - long[] threadIds = threadMXBean.getAllThreadIds(); - for (ThreadInfo threadInfo : threadMXBean.getThreadInfo(threadIds, 0)) { + + for (ThreadInfo threadInfo : getThreadInfos()) { if (threadInfo == null) { continue; // race protection } @@ -252,6 +275,19 @@ public class JvmStats { static final String TOTAL_UNLOADED_COUNT = "total_unloaded_count"; } + + private static ThreadInfo[] getThreadInfos() { + if (dumpThreadInfos != null) { + try { + return (ThreadInfo[]) dumpThreadInfos.invoke(threadMXBean, false, false, 0); + } catch (Throwable t) { + return threadMXBean.dumpAllThreads(false, false); + } + } else { + return threadMXBean.dumpAllThreads(false, false); + } + } + public static class GarbageCollectors implements Iterable<GarbageCollector> { private final GarbageCollector[] collectors; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org