You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ta...@apache.org on 2024/01/12 06:29:31 UTC

(iotdb) branch master updated: exclude gc time from cpu usage percentage for thread pool and modules (#11883)

This is an automated email from the ASF dual-hosted git repository.

tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new d1fc9b0cd79 exclude gc time from cpu usage percentage for thread pool and modules (#11883)
d1fc9b0cd79 is described below

commit d1fc9b0cd793f10ba2961c899b81ffd4f2210f12
Author: Liu Xuxin <37...@users.noreply.github.com>
AuthorDate: Fri Jan 12 14:29:24 2024 +0800

    exclude gc time from cpu usage percentage for thread pool and modules (#11883)
---
 .../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(),