This is an automated email from the ASF dual-hosted git repository.
huajianlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new a65e0806ce5 [opt](metrics) optimize performance of metrics endpoint
(#49380)
a65e0806ce5 is described below
commit a65e0806ce55224b3b10be5d896f33ce7f30a2cd
Author: 924060929 <[email protected]>
AuthorDate: Tue Mar 25 14:46:28 2025 +0800
[opt](metrics) optimize performance of metrics endpoint (#49380)
the `http://<fe_ip>:<fe_http_port>/metrics` maybe made the frontends
hung, when the threads num too large, this pr replace
`ThreadMXBean.getThreadInfos` to `ThreadMXBean.dumpAllThreads` to
optimize performance
see also:
1. https://issues.apache.org/jira/browse/HADOOP-16850
2. https://bugs.openjdk.org/browse/JDK-8185005
3. https://github.com/apache/skywalking/discussions/9190
---
.../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]