This is an automated email from the ASF dual-hosted git repository. marklau99 pushed a commit to branch optimize-cpu-metrics in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 4e7b30886f2d2f7c47f18feedb615c96c3d90576 Author: Liu Xuxin <[email protected]> AuthorDate: Tue Jan 9 15:58:16 2024 +0800 exclude gc time from cpu usage percentage for thread pool and modules --- .../iotdb/confignode/service/ConfigNode.java | 2 +- .../db/service/metrics/DataNodeMetricsHelper.java | 2 +- .../service/metric/JvmGcMonitorMetrics.java | 10 +++++++--- .../service/metric}/cpu/CpuUsageMetrics.java | 23 +++++++++++++++++++--- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java index 07f723ecc67..4565a8282bc 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java @@ -33,6 +33,7 @@ import org.apache.iotdb.commons.service.RegisterManager; import org.apache.iotdb.commons.service.ServiceType; import org.apache.iotdb.commons.service.metric.JvmGcMonitorMetrics; import org.apache.iotdb.commons.service.metric.MetricService; +import org.apache.iotdb.commons.service.metric.cpu.CpuUsageMetrics; import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.confignode.client.ConfigNodeRequestType; import org.apache.iotdb.confignode.client.sync.SyncConfigNodeClientPool; @@ -50,7 +51,6 @@ import org.apache.iotdb.confignode.service.thrift.ConfigNodeRPCServiceProcessor; import org.apache.iotdb.db.service.metrics.ProcessMetrics; import org.apache.iotdb.metrics.config.MetricConfigDescriptor; import org.apache.iotdb.metrics.metricsets.UpTimeMetrics; -import org.apache.iotdb.metrics.metricsets.cpu.CpuUsageMetrics; import org.apache.iotdb.metrics.metricsets.disk.DiskMetrics; import org.apache.iotdb.metrics.metricsets.jvm.JvmMetrics; import org.apache.iotdb.metrics.metricsets.logback.LogbackMetrics; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/DataNodeMetricsHelper.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/DataNodeMetricsHelper.java index ef06d98cebb..680585d9964 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/DataNodeMetricsHelper.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/DataNodeMetricsHelper.java @@ -28,6 +28,7 @@ import org.apache.iotdb.commons.conf.IoTDBConstant; import org.apache.iotdb.commons.service.metric.JvmGcMonitorMetrics; import org.apache.iotdb.commons.service.metric.MetricService; import org.apache.iotdb.commons.service.metric.PerformanceOverviewMetrics; +import org.apache.iotdb.commons.service.metric.cpu.CpuUsageMetrics; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.pipe.metric.PipeDataNodeMetrics; import org.apache.iotdb.db.queryengine.metric.DataExchangeCostMetricSet; @@ -40,7 +41,6 @@ import org.apache.iotdb.db.queryengine.metric.QueryRelatedResourceMetricSet; import org.apache.iotdb.db.queryengine.metric.QueryResourceMetricSet; import org.apache.iotdb.db.queryengine.metric.SeriesScanCostMetricSet; import org.apache.iotdb.metrics.metricsets.UpTimeMetrics; -import org.apache.iotdb.metrics.metricsets.cpu.CpuUsageMetrics; import org.apache.iotdb.metrics.metricsets.disk.DiskMetrics; import org.apache.iotdb.metrics.metricsets.jvm.JvmMetrics; import org.apache.iotdb.metrics.metricsets.logback.LogbackMetrics; diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/JvmGcMonitorMetrics.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/JvmGcMonitorMetrics.java index db6987bbb3c..fd7e500808c 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/JvmGcMonitorMetrics.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/JvmGcMonitorMetrics.java @@ -41,9 +41,9 @@ import java.util.concurrent.atomic.AtomicLong; public class JvmGcMonitorMetrics implements IMetricSet { // Duration of observation window - public static final long OBSERVATION_WINDOW_MS = TimeUnit.MINUTES.toMillis(1); + public static final long OBSERVATION_WINDOW_MS = TimeUnit.SECONDS.toMillis(30); // Interval for data collection - public static final long SLEEP_INTERVAL_MS = TimeUnit.SECONDS.toMillis(5); + public static final long SLEEP_INTERVAL_MS = TimeUnit.SECONDS.toMillis(3); // Max GC time threshold public static final long MAX_GC_TIME_PERCENTAGE = 30L; // The time when JvmGcMonitorMetrics start running @@ -66,7 +66,7 @@ public class JvmGcMonitorMetrics implements IMetricSet { // Hook function called with GC exception private final GcTimeAlertHandler alertHandler; - public JvmGcMonitorMetrics() { + private JvmGcMonitorMetrics() { bufSize = (int) (OBSERVATION_WINDOW_MS / SLEEP_INTERVAL_MS + 2); // Prevent the user from accidentally creating an abnormally big buffer, which will result in // slow calculations and likely inaccuracy. @@ -167,6 +167,10 @@ public class JvmGcMonitorMetrics implements IMetricSet { / Math.min(OBSERVATION_WINDOW_MS, gcMonitorRunTime))); } + public GcData getGcData() { + return curData; + } + /** Encapsulates data about GC pauses measured at the specific timestamp. */ public static class GcData implements Cloneable { // The time when this object get updated. diff --git a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuUsageMetrics.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/cpu/CpuUsageMetrics.java similarity index 94% rename from iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuUsageMetrics.java rename to iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/cpu/CpuUsageMetrics.java index 51116e9461e..d7a3f4e94e4 100644 --- a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuUsageMetrics.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/cpu/CpuUsageMetrics.java @@ -17,8 +17,9 @@ * under the License. */ -package org.apache.iotdb.metrics.metricsets.cpu; +package org.apache.iotdb.commons.service.metric.cpu; +import org.apache.iotdb.commons.service.metric.JvmGcMonitorMetrics; import org.apache.iotdb.metrics.AbstractMetricService; import org.apache.iotdb.metrics.config.MetricConfigDescriptor; import org.apache.iotdb.metrics.metricsets.IMetricSet; @@ -64,6 +65,9 @@ public class CpuUsageMetrics implements IMetricSet { private AtomicLong lastUpdateTime = new AtomicLong(0L); private AtomicLong updateCount = new AtomicLong(0); + private static final JvmGcMonitorMetrics.GcData gcData = + JvmGcMonitorMetrics.getInstance().getGcData(); + public CpuUsageMetrics( List<String> modules, List<String> pools, @@ -309,10 +313,17 @@ public class CpuUsageMetrics implements IMetricSet { processCpuLoadGauge = metricService.getAutoGauge("process_cpu_load", MetricLevel.CORE, "name", "process"); } + long gcTimePercentage = gcData.getGcTimePercentage(); double processCpuLoad = processCpuLoadGauge.getValue(); for (Map.Entry<String, Long> entry : moduleIncrementCpuTimeMap.entrySet()) { moduleCpuTimePercentageMap.put( - entry.getKey(), entry.getValue() * 1.0 / totalIncrementTime * processCpuLoad); + entry.getKey(), + entry.getValue() + * 1.0 + / totalIncrementTime + * processCpuLoad + * (100L - gcTimePercentage) // gc time is not included in module cpu usage + / 100); if (entry.getValue() > 0.0) { moduleUserTimePercentageMap.put( entry.getKey(), @@ -323,7 +334,13 @@ public class CpuUsageMetrics implements IMetricSet { } for (Map.Entry<String, Long> entry : poolIncrementCpuTimeMap.entrySet()) { poolCpuUsageMap.put( - entry.getKey(), entry.getValue() * 1.0 / totalIncrementTime * processCpuLoad); + entry.getKey(), + entry.getValue() + * 1.0 + / totalIncrementTime + * processCpuLoad + * (100L - gcTimePercentage) // gc time is not included in pool cpu usage + / 100); if (entry.getValue() > 0.0) { poolUserTimePercentageMap.put( entry.getKey(),
