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 <[email protected]>
---
.../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: [email protected]
For additional commands, e-mail: [email protected]