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 2023/03/12 14:50:45 UTC

[iotdb] branch rel/1.1 updated: [IOTDB-5627] Optimize Schedule related metrics and Update Performance Overview Dashboard (#9223) (#9300)

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

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


The following commit(s) were added to refs/heads/rel/1.1 by this push:
     new 4346eddd71 [IOTDB-5627] Optimize Schedule related metrics and Update Performance Overview Dashboard (#9223) (#9300)
4346eddd71 is described below

commit 4346eddd71e39c01eb8e2b63bcf2f4baf90573e7
Author: ZhangHongYin <46...@users.noreply.github.com>
AuthorDate: Sun Mar 12 22:50:40 2023 +0800

    [IOTDB-5627] Optimize Schedule related metrics and Update Performance Overview Dashboard (#9223) (#9300)
---
 .../consensus/iot/IoTConsensusServerImpl.java      |   11 +
 .../ratis/ApplicationStateMachineProxy.java        |   19 +
 .../iotdb/consensus/simple/SimpleConsensus.java    |   15 +
 ...pache-IoTDB-Performance-Overview-Dashboard.json | 1518 ++++++++++++++++----
 docs/UserGuide/Monitor-Alert/Metric-Tool.md        |  109 +-
 docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md     |   82 +-
 .../iotdb/commons/service/metric/enums/Metric.java |   12 +
 .../metric/enums}/PerformanceOverviewMetrics.java  |   86 +-
 .../org/apache/iotdb/db/auth/AuthorityChecker.java |    2 +-
 .../statemachine/DataRegionStateMachine.java       |    8 +-
 .../IoTConsensusDataRegionStateMachine.java        |    8 +-
 .../iotdb/db/engine/storagegroup/DataRegion.java   |  127 +-
 .../db/engine/storagegroup/TsFileProcessor.java    |   77 +-
 .../execution/executor/RegionWriteExecutor.java    |   10 +-
 .../metric/PerformanceOverviewMetricsManager.java  |  323 +++--
 .../db/mpp/plan/execution/QueryExecution.java      |    8 +-
 .../db/mpp/plan/parser/StatementGenerator.java     |   49 +-
 .../db/mpp/plan/planner/plan/node/PlanNode.java    |   10 -
 .../db/mpp/plan/scheduler/AsyncPlanNodeSender.java |   16 +-
 .../plan/scheduler/AsyncSendPlanNodeHandler.java   |   28 +-
 .../scheduler/FragmentInstanceDispatcherImpl.java  |    4 +
 21 files changed, 1807 insertions(+), 715 deletions(-)

diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java b/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
index 16e378cde4..3aadc12f57 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.commons.client.IClientManager;
 import org.apache.iotdb.commons.client.exception.ClientManagerException;
 import org.apache.iotdb.commons.service.metric.MetricService;
 import org.apache.iotdb.commons.service.metric.enums.Metric;
+import org.apache.iotdb.commons.service.metric.enums.PerformanceOverviewMetrics;
 import org.apache.iotdb.commons.service.metric.enums.Tag;
 import org.apache.iotdb.consensus.IStateMachine;
 import org.apache.iotdb.consensus.common.DataSet;
@@ -221,7 +222,17 @@ public class IoTConsensusServerImpl {
             indexedConsensusRequest.getSearchIndex());
       }
       IConsensusRequest planNode = stateMachine.deserializeRequest(indexedConsensusRequest);
+      long startWriteTime = System.nanoTime();
       TSStatus result = stateMachine.write(planNode);
+      MetricService.getInstance()
+          .timer(
+              System.nanoTime() - startWriteTime,
+              TimeUnit.NANOSECONDS,
+              Metric.PERFORMANCE_OVERVIEW_STORAGE_DETAIL.toString(),
+              MetricLevel.IMPORTANT,
+              Tag.STAGE.toString(),
+              PerformanceOverviewMetrics.ENGINE);
+
       long writeToStateMachineEndTime = System.nanoTime();
       // statistic the time of writing request into stateMachine
       MetricService.getInstance()
diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
index 2fd055baa7..da94ded6b0 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
@@ -19,10 +19,15 @@
 package org.apache.iotdb.consensus.ratis;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.service.metric.MetricService;
+import org.apache.iotdb.commons.service.metric.enums.Metric;
+import org.apache.iotdb.commons.service.metric.enums.PerformanceOverviewMetrics;
+import org.apache.iotdb.commons.service.metric.enums.Tag;
 import org.apache.iotdb.consensus.IStateMachine;
 import org.apache.iotdb.consensus.common.DataSet;
 import org.apache.iotdb.consensus.common.request.ByteBufferConsensusRequest;
 import org.apache.iotdb.consensus.common.request.IConsensusRequest;
+import org.apache.iotdb.metrics.utils.MetricLevel;
 
 import org.apache.ratis.proto.RaftProtos;
 import org.apache.ratis.proto.RaftProtos.RaftConfigurationProto;
@@ -103,6 +108,7 @@ public class ApplicationStateMachineProxy extends BaseStateMachine {
 
   @Override
   public CompletableFuture<Message> applyTransaction(TransactionContext trx) {
+    boolean isLeader = false;
     RaftProtos.LogEntryProto log = trx.getLogEntry();
     updateLastAppliedTermIndex(log.getTerm(), log.getIndex());
 
@@ -114,6 +120,7 @@ public class ApplicationStateMachineProxy extends BaseStateMachine {
         && trx.getClientRequest().getMessage() instanceof RequestMessage) {
       RequestMessage requestMessage = (RequestMessage) trx.getClientRequest().getMessage();
       applicationRequest = requestMessage.getActualRequest();
+      isLeader = true;
     } else {
       applicationRequest =
           new ByteBufferConsensusRequest(
@@ -132,7 +139,19 @@ public class ApplicationStateMachineProxy extends BaseStateMachine {
         }
         IConsensusRequest deserializedRequest =
             applicationStateMachine.deserializeRequest(applicationRequest);
+
+        long startWriteTime = System.nanoTime();
         TSStatus result = applicationStateMachine.write(deserializedRequest);
+        if (isLeader) {
+          MetricService.getInstance()
+              .timer(
+                  System.nanoTime() - startWriteTime,
+                  TimeUnit.NANOSECONDS,
+                  Metric.PERFORMANCE_OVERVIEW_STORAGE_DETAIL.toString(),
+                  MetricLevel.IMPORTANT,
+                  Tag.STAGE.toString(),
+                  PerformanceOverviewMetrics.ENGINE);
+        }
 
         if (firstTry) {
           finalStatus = result;
diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/simple/SimpleConsensus.java b/consensus/src/main/java/org/apache/iotdb/consensus/simple/SimpleConsensus.java
index 0a112d1bbf..e5db5ba9fd 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/simple/SimpleConsensus.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/simple/SimpleConsensus.java
@@ -22,6 +22,10 @@ package org.apache.iotdb.consensus.simple;
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.consensus.ConsensusGroupId;
+import org.apache.iotdb.commons.service.metric.MetricService;
+import org.apache.iotdb.commons.service.metric.enums.Metric;
+import org.apache.iotdb.commons.service.metric.enums.PerformanceOverviewMetrics;
+import org.apache.iotdb.commons.service.metric.enums.Tag;
 import org.apache.iotdb.commons.utils.FileUtils;
 import org.apache.iotdb.consensus.IConsensus;
 import org.apache.iotdb.consensus.IStateMachine;
@@ -36,6 +40,7 @@ import org.apache.iotdb.consensus.exception.ConsensusGroupAlreadyExistException;
 import org.apache.iotdb.consensus.exception.ConsensusGroupNotExistException;
 import org.apache.iotdb.consensus.exception.IllegalPeerEndpointException;
 import org.apache.iotdb.consensus.exception.IllegalPeerNumException;
+import org.apache.iotdb.metrics.utils.MetricLevel;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.slf4j.Logger;
@@ -50,6 +55,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -121,7 +127,16 @@ class SimpleConsensus implements IConsensus {
       status = new TSStatus(TSStatusCode.SYSTEM_READ_ONLY.getStatusCode());
       status.setMessage("Fail to do non-query operations because system is read-only.");
     } else {
+      long startWriteTime = System.nanoTime();
       status = impl.write(request);
+      MetricService.getInstance()
+          .timer(
+              System.nanoTime() - startWriteTime,
+              TimeUnit.NANOSECONDS,
+              Metric.PERFORMANCE_OVERVIEW_STORAGE_DETAIL.toString(),
+              MetricLevel.IMPORTANT,
+              Tag.STAGE.toString(),
+              PerformanceOverviewMetrics.ENGINE);
     }
     return ConsensusWriteResponse.newBuilder().setStatus(status).build();
   }
diff --git a/docs/UserGuide/Monitor-Alert/Apache-IoTDB-Performance-Overview-Dashboard.json b/docs/UserGuide/Monitor-Alert/Apache-IoTDB-Performance-Overview-Dashboard.json
index 7620f7914e..23796fcceb 100644
--- a/docs/UserGuide/Monitor-Alert/Apache-IoTDB-Performance-Overview-Dashboard.json
+++ b/docs/UserGuide/Monitor-Alert/Apache-IoTDB-Performance-Overview-Dashboard.json
@@ -69,7 +69,7 @@
   "fiscalYearStartMonth": 0,
   "graphTooltip": 1,
   "id": null,
-  "iteration": 1677469194439,
+  "iteration": 1678345679839,
   "links": [],
   "liveNow": false,
   "panels": [
@@ -694,6 +694,844 @@
       "title": "Performance",
       "type": "row"
     },
+    {
+      "description": "",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [
+            {
+              "options": {
+                "match": "empty",
+                "result": {
+                  "index": 0,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            },
+            {
+              "options": {
+                "match": "null+nan",
+                "result": {
+                  "index": 1,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            }
+          ],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "ns"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 0,
+        "y": 10
+      },
+      "id": 56,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true
+        },
+        "tooltip": {
+          "mode": "multi",
+          "sort": "desc"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "exemplar": true,
+          "expr": "sum(rate(session_idle_time_sum{instance=\"$instance\"}[1m])) / sum(rate(session_idle_time_count{instance=\"$instance\"}[1m]))",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "Average Idle",
+          "range": true,
+          "refId": "B"
+        },
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "exemplar": true,
+          "expr": "sum(rate(performance_overview_seconds_sum{instance=~\"$instance\"}[1m])) / sum(rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])) * 1000000000",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "Average Busy",
+          "refId": "A"
+        }
+      ],
+      "title": "Session Idle Time",
+      "type": "timeseries"
+    },
+    {
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 5,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              },
+              {
+                "color": "red",
+                "value": 80
+              }
+            ]
+          }
+        },
+        "overrides": [
+          {
+            "__systemRef": "hideSeriesFrom",
+            "matcher": {
+              "id": "byNames",
+              "options": {
+                "mode": "exclude",
+                "names": [
+                  "Total"
+                ],
+                "prefix": "All except:",
+                "readOnly": true
+              }
+            },
+            "properties": [
+              {
+                "id": "custom.hideFrom",
+                "value": {
+                  "legend": false,
+                  "tooltip": false,
+                  "viz": true
+                }
+              }
+            ]
+          }
+        ]
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 12,
+        "y": 10
+      },
+      "id": 54,
+      "options": {
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "bottom"
+        },
+        "tooltip": {
+          "mode": "single",
+          "sort": "none"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "exemplar": true,
+          "expr": "thrift_connections{instance=~\"$instance\", name=~\".*Client.*\"}",
+          "interval": "",
+          "legendFormat": "Total",
+          "refId": "A"
+        },
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "exemplar": true,
+          "expr": "thrift_active_threads{instance=~\"$instance\", name=~\".*Client.*\"}",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "Active",
+          "refId": "B"
+        }
+      ],
+      "title": "Client Connection",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "prometheus",
+        "uid": "${DS_PROMETHEUS}"
+      },
+      "description": "",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "s"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 0,
+        "y": 18
+      },
+      "id": 22,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true
+        },
+        "tooltip": {
+          "mode": "multi",
+          "sort": "desc"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "performance_overview_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+          "hide": false,
+          "legendFormat": "{{type}} - {{interface}} - 99",
+          "range": true,
+          "refId": "A"
+        },
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "sum(rate(performance_overview_seconds_sum{instance=~\"$instance\"}[1m]) / rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])) by (instance, interface, type)",
+          "hide": false,
+          "legendFormat": "{{type}} - {{interface}} - avg",
+          "range": true,
+          "refId": "B"
+        }
+      ],
+      "title": "Time Consumed Of Operation",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "prometheus",
+        "uid": "${DS_PROMETHEUS}"
+      },
+      "description": "",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [
+            {
+              "options": {
+                "match": "empty",
+                "result": {
+                  "index": 0,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            },
+            {
+              "options": {
+                "match": "null+nan",
+                "result": {
+                  "index": 1,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            }
+          ],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "s"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 8,
+        "y": 18
+      },
+      "id": 50,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true
+        },
+        "tooltip": {
+          "mode": "multi",
+          "sort": "desc"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "sum(rate(entry_seconds_sum{instance=\"$instance\"}[1m]) / rate(entry_seconds_count{instance=\"$instance\"}[1m])) by (instance, name)",
+          "hide": false,
+          "legendFormat": "{{name}}",
+          "range": true,
+          "refId": "B"
+        }
+      ],
+      "title": "Average Time Consumed Of Interface",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "prometheus",
+        "uid": "${DS_PROMETHEUS}"
+      },
+      "description": "",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "s"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 16,
+        "y": 18
+      },
+      "id": 57,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true
+        },
+        "tooltip": {
+          "mode": "multi",
+          "sort": "desc"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "entry_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+          "hide": false,
+          "legendFormat": "{{name}}",
+          "range": true,
+          "refId": "A"
+        }
+      ],
+      "title": "P99 Time Consumed Of Interface",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "prometheus",
+        "uid": "${DS_PROMETHEUS}"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 0,
+        "y": 26
+      },
+      "id": 11,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true
+        },
+        "tooltip": {
+          "mode": "multi",
+          "sort": "desc"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "queue{instance=~\"$instance\"}",
+          "legendFormat": "{{name}}-{{status}}",
+          "range": true,
+          "refId": "A"
+        }
+      ],
+      "title": "Task Number",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "prometheus",
+        "uid": "${DS_PROMETHEUS}"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [
+            {
+              "options": {
+                "match": "empty",
+                "result": {
+                  "index": 0,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            },
+            {
+              "options": {
+                "match": "null+nan",
+                "result": {
+                  "index": 1,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            }
+          ],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "s"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 8,
+        "y": 26
+      },
+      "id": 51,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true
+        },
+        "tooltip": {
+          "mode": "multi",
+          "sort": "desc"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "rate(cost_task_seconds_sum{instance=~\"$instance\"}[1m])/rate(cost_task_seconds_count{instance=~\"$instance\"}[1m])",
+          "hide": false,
+          "legendFormat": "{{name}}",
+          "range": true,
+          "refId": "B"
+        }
+      ],
+      "title": "Average Time Consumed of Task",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "prometheus",
+        "uid": "${DS_PROMETHEUS}"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "s"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 16,
+        "y": 26
+      },
+      "id": 13,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true
+        },
+        "tooltip": {
+          "mode": "multi",
+          "sort": "desc"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "cost_task_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+          "legendFormat": "{{name}}",
+          "range": true,
+          "refId": "A"
+        }
+      ],
+      "title": "P99 Time Consumed of Task",
+      "type": "timeseries"
+    },
     {
       "datasource": {
         "type": "prometheus",
@@ -751,9 +1589,110 @@
         "h": 8,
         "w": 10,
         "x": 0,
-        "y": 10
+        "y": 34
+      },
+      "id": 21,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true,
+          "sortBy": "Last *",
+          "sortDesc": true
+        },
+        "tooltip": {
+          "mode": "multi",
+          "sort": "desc"
+        }
+      },
+      "targets": [
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])",
+          "hide": false,
+          "legendFormat": "operation {{type}} {{interface}}",
+          "range": true,
+          "refId": "B"
+        },
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "editorMode": "code",
+          "expr": "rate(entry_seconds_count{instance=~\"$instance\"}[1m])",
+          "hide": false,
+          "legendFormat": "rpc {{name}}",
+          "range": true,
+          "refId": "A"
+        }
+      ],
+      "title": "OPS",
+      "type": "timeseries"
+    },
+    {
+      "description": "",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "none"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 7,
+        "x": 10,
+        "y": 34
       },
-      "id": 21,
+      "id": 45,
       "options": {
         "legend": {
           "calcs": [
@@ -777,26 +1716,16 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
-          "expr": "rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])",
+          "exemplar": true,
+          "expr": "rate(performance_overview_detail_seconds_count{instance=\"$instance\"}[1m])",
           "hide": false,
-          "legendFormat": "operation {{type}} {{interface}}",
+          "interval": "",
+          "legendFormat": "{{stage}}",
           "range": true,
           "refId": "B"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "${DS_PROMETHEUS}"
-          },
-          "editorMode": "code",
-          "expr": "rate(entry_seconds_count{instance=~\"$instance\"}[1m])",
-          "hide": false,
-          "legendFormat": "rpc {{name}}",
-          "range": true,
-          "refId": "A"
         }
       ],
-      "title": "OPS",
+      "title": "OPS Of Stage",
       "type": "timeseries"
     },
     {
@@ -855,10 +1784,10 @@
       "gridPos": {
         "h": 8,
         "w": 7,
-        "x": 10,
-        "y": 10
+        "x": 17,
+        "y": 34
       },
-      "id": 45,
+      "id": 27,
       "options": {
         "legend": {
           "calcs": [
@@ -883,7 +1812,7 @@
           },
           "editorMode": "code",
           "exemplar": true,
-          "expr": "rate(performance_overview_detail_seconds_count{instance=\"$instance\"}[1m])",
+          "expr": "rate(performance_overview_schedule_detail_seconds_count{instance=\"$instance\"}[1m])",
           "hide": false,
           "interval": "",
           "legendFormat": "{{stage}}",
@@ -891,14 +1820,10 @@
           "refId": "B"
         }
       ],
-      "title": "OPS Of Stage",
+      "title": "OPS Of Schedule",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -949,11 +1874,11 @@
       },
       "gridPos": {
         "h": 8,
-        "w": 7,
-        "x": 17,
-        "y": 10
+        "w": 8,
+        "x": 0,
+        "y": 42
       },
-      "id": 27,
+      "id": 64,
       "options": {
         "legend": {
           "calcs": [
@@ -978,7 +1903,7 @@
           },
           "editorMode": "code",
           "exemplar": true,
-          "expr": "rate(performance_overview_schedule_detail_seconds_count{instance=\"$instance\"}[1m])",
+          "expr": "rate(performance_overview_local_detail_seconds_count{instance=\"$instance\"}[1m])",
           "hide": false,
           "interval": "",
           "legendFormat": "{{stage}}",
@@ -986,14 +1911,10 @@
           "refId": "B"
         }
       ],
-      "title": "OPS Of Schedule",
+      "title": "OPS Of Local Schedule Stage",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1038,17 +1959,17 @@
               }
             ]
           },
-          "unit": "s"
+          "unit": "none"
         },
         "overrides": []
       },
       "gridPos": {
         "h": 8,
         "w": 8,
-        "x": 0,
-        "y": 18
+        "x": 8,
+        "y": 42
       },
-      "id": 22,
+      "id": 65,
       "options": {
         "legend": {
           "calcs": [
@@ -1056,7 +1977,9 @@
           ],
           "displayMode": "table",
           "placement": "right",
-          "showLegend": true
+          "showLegend": true,
+          "sortBy": "Last *",
+          "sortDesc": true
         },
         "tooltip": {
           "mode": "multi",
@@ -1070,33 +1993,31 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
-          "expr": "performance_overview_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+          "exemplar": true,
+          "expr": "rate(performance_overview_storage_detail_seconds_count{instance=\"$instance\"}[1m])",
           "hide": false,
-          "legendFormat": "{{type}} - {{interface}} - 99",
+          "interval": "",
+          "legendFormat": "{{stage}}",
           "range": true,
-          "refId": "A"
+          "refId": "B"
         },
         {
           "datasource": {
             "type": "prometheus",
             "uid": "${DS_PROMETHEUS}"
           },
-          "editorMode": "code",
-          "expr": "sum(rate(performance_overview_seconds_sum{instance=~\"$instance\"}[1m]) / rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])) by (instance, interface, type)",
+          "exemplar": true,
+          "expr": "rate(performance_overview_storage_detail_seconds_count{instance=\"$instance\"}[1m])",
           "hide": false,
-          "legendFormat": "{{type}} - {{interface}} - avg",
-          "range": true,
-          "refId": "B"
+          "interval": "",
+          "legendFormat": "consensus",
+          "refId": "A"
         }
       ],
-      "title": "Time Consumed Of Operation",
+      "title": "OPS Of Storage Stage",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1131,28 +2052,7 @@
               "mode": "off"
             }
           },
-          "mappings": [
-            {
-              "options": {
-                "match": "empty",
-                "result": {
-                  "index": 0,
-                  "text": "0"
-                }
-              },
-              "type": "special"
-            },
-            {
-              "options": {
-                "match": "null+nan",
-                "result": {
-                  "index": 1,
-                  "text": "0"
-                }
-              },
-              "type": "special"
-            }
-          ],
+          "mappings": [],
           "thresholds": {
             "mode": "absolute",
             "steps": [
@@ -1162,17 +2062,17 @@
               }
             ]
           },
-          "unit": "s"
+          "unit": "none"
         },
         "overrides": []
       },
       "gridPos": {
         "h": 8,
         "w": 8,
-        "x": 8,
-        "y": 18
+        "x": 16,
+        "y": 42
       },
-      "id": 50,
+      "id": 66,
       "options": {
         "legend": {
           "calcs": [
@@ -1180,7 +2080,9 @@
           ],
           "displayMode": "table",
           "placement": "right",
-          "showLegend": true
+          "showLegend": true,
+          "sortBy": "Last *",
+          "sortDesc": true
         },
         "tooltip": {
           "mode": "multi",
@@ -1194,21 +2096,19 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
-          "expr": "sum(rate(entry_seconds_sum{instance=\"$instance\"}[1m]) / rate(entry_seconds_count{instance=\"$instance\"}[1m])) by (instance, name)",
+          "exemplar": true,
+          "expr": "rate(performance_overview_engine_detail_seconds_count{instance=\"$instance\"}[1m])",
           "hide": false,
-          "legendFormat": "{{name}}",
+          "interval": "",
+          "legendFormat": "{{stage}}",
           "range": true,
           "refId": "B"
         }
       ],
-      "title": "Average Time Consumed Of Interface",
+      "title": "OPS Of Engine Stage",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1243,7 +2143,28 @@
               "mode": "off"
             }
           },
-          "mappings": [],
+          "mappings": [
+            {
+              "options": {
+                "match": "empty",
+                "result": {
+                  "index": 0,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            },
+            {
+              "options": {
+                "match": "null+nan",
+                "result": {
+                  "index": 1,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            }
+          ],
           "thresholds": {
             "mode": "absolute",
             "steps": [
@@ -1259,11 +2180,11 @@
       },
       "gridPos": {
         "h": 8,
-        "w": 8,
-        "x": 16,
-        "y": 18
+        "w": 12,
+        "x": 0,
+        "y": 50
       },
-      "id": 57,
+      "id": 46,
       "options": {
         "legend": {
           "calcs": [
@@ -1285,14 +2206,16 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
-          "expr": "entry_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+          "exemplar": true,
+          "expr": "sum(rate(performance_overview_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_detail_seconds_count{instance=\"$instance\"}[1m])) by (instance, stage)",
           "hide": false,
-          "legendFormat": "{{name}}",
+          "interval": "",
+          "legendFormat": "{{stage}}",
           "range": true,
-          "refId": "A"
+          "refId": "B"
         }
       ],
-      "title": "P99 Time Consumed Of Interface",
+      "title": "Average Time Consumed Of Stage",
       "type": "timeseries"
     },
     {
@@ -1333,7 +2256,7 @@
           "mappings": [
             {
               "options": {
-                "match": "empty",
+                "match": "null+nan",
                 "result": {
                   "index": 0,
                   "text": "0"
@@ -1343,7 +2266,7 @@
             },
             {
               "options": {
-                "match": "null+nan",
+                "match": "empty",
                 "result": {
                   "index": 1,
                   "text": "0"
@@ -1361,17 +2284,17 @@
               }
             ]
           },
-          "unit": "ns"
+          "unit": "s"
         },
         "overrides": []
       },
       "gridPos": {
         "h": 8,
         "w": 12,
-        "x": 0,
-        "y": 26
+        "x": 12,
+        "y": 50
       },
-      "id": 56,
+      "id": 58,
       "options": {
         "legend": {
           "calcs": [
@@ -1394,30 +2317,19 @@
           },
           "editorMode": "code",
           "exemplar": true,
-          "expr": "sum(rate(session_idle_time_sum{instance=\"$instance\"}[1m])) / sum(rate(session_idle_time_count{instance=\"$instance\"}[1m]))",
+          "expr": "sum(rate(performance_overview_schedule_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_schedule_detail_seconds_count{instance=\"$instance\"}[1m])) by (stage)",
           "hide": false,
           "interval": "",
-          "legendFormat": "Average Idle",
+          "legendFormat": "{{stage}}",
           "range": true,
           "refId": "B"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "${DS_PROMETHEUS}"
-          },
-          "exemplar": true,
-          "expr": "sum(rate(performance_overview_seconds_sum{instance=~\"$instance\"}[1m])) / sum(rate(performance_overview_seconds_count{instance=~\"$instance\"}[1m])) * 1000000000",
-          "hide": false,
-          "interval": "",
-          "legendFormat": "Average Busy",
-          "refId": "A"
         }
       ],
-      "title": "Session Idle Time",
+      "title": "Average Time Consumed Of Schedule Stage",
       "type": "timeseries"
     },
     {
+      "description": "",
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -1428,7 +2340,7 @@
             "axisPlacement": "auto",
             "barAlignment": 0,
             "drawStyle": "line",
-            "fillOpacity": 5,
+            "fillOpacity": 10,
             "gradientMode": "none",
             "hideFrom": {
               "legend": false,
@@ -1451,64 +2363,60 @@
               "mode": "off"
             }
           },
-          "mappings": [],
+          "mappings": [
+            {
+              "options": {
+                "match": "null+nan",
+                "result": {
+                  "index": 0,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            },
+            {
+              "options": {
+                "match": "empty",
+                "result": {
+                  "index": 1,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            }
+          ],
           "thresholds": {
             "mode": "absolute",
             "steps": [
               {
                 "color": "green",
                 "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          }
-        },
-        "overrides": [
-          {
-            "__systemRef": "hideSeriesFrom",
-            "matcher": {
-              "id": "byNames",
-              "options": {
-                "mode": "exclude",
-                "names": [
-                  "Total"
-                ],
-                "prefix": "All except:",
-                "readOnly": true
-              }
-            },
-            "properties": [
-              {
-                "id": "custom.hideFrom",
-                "value": {
-                  "legend": false,
-                  "tooltip": false,
-                  "viz": true
-                }
               }
             ]
-          }
-        ]
+          },
+          "unit": "s"
+        },
+        "overrides": []
       },
       "gridPos": {
         "h": 8,
-        "w": 12,
-        "x": 12,
-        "y": 26
+        "w": 8,
+        "x": 0,
+        "y": 58
       },
-      "id": 54,
+      "id": 60,
       "options": {
         "legend": {
-          "calcs": [],
-          "displayMode": "list",
-          "placement": "bottom"
+          "calcs": [
+            "mean"
+          ],
+          "displayMode": "table",
+          "placement": "right",
+          "showLegend": true
         },
         "tooltip": {
-          "mode": "single",
-          "sort": "none"
+          "mode": "multi",
+          "sort": "desc"
         }
       },
       "targets": [
@@ -1518,32 +2426,17 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "exemplar": true,
-          "expr": "thrift_connections{instance=~\"$instance\", name=~\".*Client.*\"}",
-          "interval": "",
-          "legendFormat": "Total",
-          "refId": "A"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "${DS_PROMETHEUS}"
-          },
-          "exemplar": true,
-          "expr": "thrift_active_threads{instance=~\"$instance\", name=~\".*Client.*\"}",
+          "expr": "sum(rate(performance_overview_local_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_local_detail_seconds_count{instance=\"$instance\"}[1m])) by (stage)",
           "hide": false,
           "interval": "",
-          "legendFormat": "Active",
-          "refId": "B"
+          "legendFormat": "{{stage}}",
+          "refId": "A"
         }
       ],
-      "title": "Client Connection",
+      "title": " Average Time Consumed Of Local Schedule Stage",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1581,7 +2474,7 @@
           "mappings": [
             {
               "options": {
-                "match": "empty",
+                "match": "null+nan",
                 "result": {
                   "index": 0,
                   "text": "0"
@@ -1591,7 +2484,7 @@
             },
             {
               "options": {
-                "match": "null+nan",
+                "match": "empty",
                 "result": {
                   "index": 1,
                   "text": "0"
@@ -1615,11 +2508,11 @@
       },
       "gridPos": {
         "h": 8,
-        "w": 12,
-        "x": 0,
-        "y": 34
+        "w": 8,
+        "x": 8,
+        "y": 58
       },
-      "id": 46,
+      "id": 61,
       "options": {
         "legend": {
           "calcs": [
@@ -1640,22 +2533,30 @@
             "type": "prometheus",
             "uid": "${DS_PROMETHEUS}"
           },
-          "editorMode": "code",
-          "expr": "sum(rate(performance_overview_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_detail_seconds_count{instance=\"$instance\"}[1m])) by (instance, stage)",
+          "exemplar": true,
+          "expr": "abs(sum(rate(performance_overview_local_detail_seconds_sum{instance=\"$instance\", stage=\"storage\"}[1m])) - sum(rate(performance_overview_storage_detail_seconds_sum{instance=\"$instance\", stage=\"engine\"}[1m]))) / sum(rate(performance_overview_storage_detail_seconds_count{instance=\"$instance\", stage=\"engine\"}[1m]))",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "consensus",
+          "refId": "A"
+        },
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "exemplar": true,
+          "expr": "rate(performance_overview_storage_detail_seconds_sum{instance=\"$instance\", stage=\"engine\"}[1m]) / rate(performance_overview_storage_detail_seconds_count{instance=\"$instance\", stage=\"engine\"}[1m])",
           "hide": false,
+          "interval": "",
           "legendFormat": "{{stage}}",
-          "range": true,
           "refId": "B"
         }
       ],
-      "title": "Average Time Consumed Of Stage",
+      "title": "Average Time Consumed Of Storage Stage",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1690,7 +2591,28 @@
               "mode": "off"
             }
           },
-          "mappings": [],
+          "mappings": [
+            {
+              "options": {
+                "match": "null+nan",
+                "result": {
+                  "index": 0,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            },
+            {
+              "options": {
+                "match": "empty",
+                "result": {
+                  "index": 1,
+                  "text": "0"
+                }
+              },
+              "type": "special"
+            }
+          ],
           "thresholds": {
             "mode": "absolute",
             "steps": [
@@ -1706,11 +2628,11 @@
       },
       "gridPos": {
         "h": 8,
-        "w": 12,
-        "x": 12,
-        "y": 34
+        "w": 8,
+        "x": 16,
+        "y": 58
       },
-      "id": 24,
+      "id": 47,
       "options": {
         "legend": {
           "calcs": [
@@ -1731,15 +2653,15 @@
             "type": "prometheus",
             "uid": "${DS_PROMETHEUS}"
           },
-          "editorMode": "code",
-          "expr": "performance_overview_detail_seconds{instance=\"$instance\", quantile=\"0.99\"}",
+          "exemplar": true,
+          "expr": "rate(performance_overview_engine_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_engine_detail_seconds_count{instance=\"$instance\"}[1m])",
           "hide": false,
+          "interval": "",
           "legendFormat": "{{stage}}",
-          "range": true,
           "refId": "A"
         }
       ],
-      "title": "P99 Time Consumed Of Stage",
+      "title": "Average Time Consumed Of Engine Stage",
       "type": "timeseries"
     },
     {
@@ -1781,28 +2703,7 @@
               "mode": "off"
             }
           },
-          "mappings": [
-            {
-              "options": {
-                "match": "null+nan",
-                "result": {
-                  "index": 0,
-                  "text": "0"
-                }
-              },
-              "type": "special"
-            },
-            {
-              "options": {
-                "match": "empty",
-                "result": {
-                  "index": 1,
-                  "text": "0"
-                }
-              },
-              "type": "special"
-            }
-          ],
+          "mappings": [],
           "thresholds": {
             "mode": "absolute",
             "steps": [
@@ -1814,15 +2715,43 @@
           },
           "unit": "s"
         },
-        "overrides": []
+        "overrides": [
+          {
+            "__systemRef": "hideSeriesFrom",
+            "matcher": {
+              "id": "byNames",
+              "options": {
+                "mode": "exclude",
+                "names": [
+                  "analyzer",
+                  "authority",
+                  "parser",
+                  "planner"
+                ],
+                "prefix": "All except:",
+                "readOnly": true
+              }
+            },
+            "properties": [
+              {
+                "id": "custom.hideFrom",
+                "value": {
+                  "legend": false,
+                  "tooltip": false,
+                  "viz": true
+                }
+              }
+            ]
+          }
+        ]
       },
       "gridPos": {
         "h": 8,
         "w": 12,
         "x": 0,
-        "y": 42
+        "y": 66
       },
-      "id": 47,
+      "id": 24,
       "options": {
         "legend": {
           "calcs": [
@@ -1844,21 +2773,17 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
-          "expr": "sum(rate(performance_overview_schedule_detail_seconds_sum{instance=\"$instance\"}[1m]) / rate(performance_overview_schedule_detail_seconds_count{instance=\"$instance\"}[1m])) by (stage)",
+          "expr": "performance_overview_detail_seconds{instance=\"$instance\", quantile=\"0.99\"}",
           "hide": false,
           "legendFormat": "{{stage}}",
           "range": true,
-          "refId": "B"
+          "refId": "A"
         }
       ],
-      "title": "Average Time Consumed Of Schedule Stage",
+      "title": "P99 Time Consumed Of Stage",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1911,7 +2836,7 @@
         "h": 8,
         "w": 12,
         "x": 12,
-        "y": 42
+        "y": 66
       },
       "id": 28,
       "options": {
@@ -1935,8 +2860,10 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
+          "exemplar": true,
           "expr": "performance_overview_schedule_detail_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
           "hide": false,
+          "interval": "",
           "legendFormat": "{{stage}}",
           "range": true,
           "refId": "A"
@@ -1946,10 +2873,7 @@
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
+      "description": "",
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -1992,7 +2916,8 @@
                 "value": null
               }
             ]
-          }
+          },
+          "unit": "s"
         },
         "overrides": []
       },
@@ -2000,9 +2925,9 @@
         "h": 8,
         "w": 8,
         "x": 0,
-        "y": 50
+        "y": 74
       },
-      "id": 11,
+      "id": 59,
       "options": {
         "legend": {
           "calcs": [
@@ -2024,20 +2949,20 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
-          "expr": "queue{instance=~\"$instance\"}",
-          "legendFormat": "{{name}}-{{status}}",
+          "exemplar": true,
+          "expr": "performance_overview_local_detail_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "{{stage}}",
           "range": true,
           "refId": "A"
         }
       ],
-      "title": "Task Number",
+      "title": "P99 Time Consumed Of Local Schedule Stage",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
+      "description": "",
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -2071,28 +2996,7 @@
               "mode": "off"
             }
           },
-          "mappings": [
-            {
-              "options": {
-                "match": "empty",
-                "result": {
-                  "index": 0,
-                  "text": "0"
-                }
-              },
-              "type": "special"
-            },
-            {
-              "options": {
-                "match": "null+nan",
-                "result": {
-                  "index": 1,
-                  "text": "0"
-                }
-              },
-              "type": "special"
-            }
-          ],
+          "mappings": [],
           "thresholds": {
             "mode": "absolute",
             "steps": [
@@ -2110,9 +3014,9 @@
         "h": 8,
         "w": 8,
         "x": 8,
-        "y": 50
+        "y": 74
       },
-      "id": 51,
+      "id": 62,
       "options": {
         "legend": {
           "calcs": [
@@ -2134,21 +3038,34 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
-          "expr": "rate(cost_task_seconds_sum{instance=~\"$instance\"}[1m])/rate(cost_task_seconds_count{instance=~\"$instance\"}[1m])",
+          "exemplar": true,
+          "expr": "sum(performance_overview_local_detail_seconds{instance=~\"$instance\", quantile=\"0.99\", stage=\"storage\"}) - sum(performance_overview_storage_detail_seconds{instance=~\"$instance\", quantile=\"0.99\", stage=\"engine\"})",
           "hide": false,
-          "legendFormat": "{{name}}",
+          "instant": false,
+          "interval": "",
+          "legendFormat": "consensus",
           "range": true,
+          "refId": "A"
+        },
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "${DS_PROMETHEUS}"
+          },
+          "exemplar": true,
+          "expr": "performance_overview_storage_detail_seconds{instance=~\"$instance\", quantile=\"0.99\", stage=\"engine\"}",
+          "hide": false,
+          "instant": false,
+          "interval": "",
+          "legendFormat": "{{stage}}",
           "refId": "B"
         }
       ],
-      "title": "Average Time Consumed of Task",
+      "title": "P99 Time Consumed Of Storage Stage",
       "type": "timeseries"
     },
     {
-      "datasource": {
-        "type": "prometheus",
-        "uid": "${DS_PROMETHEUS}"
-      },
+      "description": "",
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -2200,9 +3117,9 @@
         "h": 8,
         "w": 8,
         "x": 16,
-        "y": 50
+        "y": 74
       },
-      "id": 13,
+      "id": 63,
       "options": {
         "legend": {
           "calcs": [
@@ -2224,13 +3141,16 @@
             "uid": "${DS_PROMETHEUS}"
           },
           "editorMode": "code",
-          "expr": "cost_task_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
-          "legendFormat": "{{name}}",
+          "exemplar": true,
+          "expr": "performance_overview_engine_detail_seconds{instance=~\"$instance\", quantile=\"0.99\"}",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "{{stage}}",
           "range": true,
           "refId": "A"
         }
       ],
-      "title": "P99 Time Consumed of Task",
+      "title": "P99 Time Consumed Of Engine Stage",
       "type": "timeseries"
     },
     {
@@ -2243,7 +3163,7 @@
         "h": 1,
         "w": 24,
         "x": 0,
-        "y": 58
+        "y": 82
       },
       "id": 34,
       "panels": [],
@@ -2315,7 +3235,7 @@
         "h": 8,
         "w": 8,
         "x": 0,
-        "y": 59
+        "y": 83
       },
       "id": 15,
       "options": {
@@ -2415,7 +3335,7 @@
         "h": 8,
         "w": 8,
         "x": 8,
-        "y": 59
+        "y": 83
       },
       "id": 18,
       "options": {
@@ -2519,7 +3439,7 @@
         "h": 8,
         "w": 8,
         "x": 16,
-        "y": 59
+        "y": 83
       },
       "id": 17,
       "options": {
@@ -2620,7 +3540,7 @@
         "h": 8,
         "w": 8,
         "x": 0,
-        "y": 67
+        "y": 91
       },
       "id": 48,
       "options": {
@@ -2733,7 +3653,7 @@
         "h": 8,
         "w": 8,
         "x": 8,
-        "y": 67
+        "y": 91
       },
       "id": 52,
       "options": {
@@ -2821,7 +3741,7 @@
         "h": 8,
         "w": 8,
         "x": 16,
-        "y": 67
+        "y": 91
       },
       "id": 49,
       "options": {
@@ -2982,7 +3902,7 @@
         "h": 8,
         "w": 8,
         "x": 0,
-        "y": 75
+        "y": 99
       },
       "id": 44,
       "options": {
@@ -3143,7 +4063,7 @@
         "h": 8,
         "w": 8,
         "x": 8,
-        "y": 75
+        "y": 99
       },
       "id": 16,
       "options": {
@@ -3319,7 +4239,7 @@
         "h": 8,
         "w": 8,
         "x": 16,
-        "y": 75
+        "y": 99
       },
       "id": 20,
       "options": {
@@ -3352,7 +4272,7 @@
       "type": "timeseries"
     }
   ],
-  "refresh": "10s",
+  "refresh": "30s",
   "schemaVersion": 35,
   "style": "dark",
   "tags": [],
@@ -3425,6 +4345,6 @@
   "timezone": "browser",
   "title": "Apache IoTDB Performance Overview Dashboard",
   "uid": "ZRfEph04k",
-  "version": 2,
+  "version": 4,
   "weekStart": ""
 }
\ No newline at end of file
diff --git a/docs/UserGuide/Monitor-Alert/Metric-Tool.md b/docs/UserGuide/Monitor-Alert/Metric-Tool.md
index eb298ed263..e8145023c1 100644
--- a/docs/UserGuide/Monitor-Alert/Metric-Tool.md
+++ b/docs/UserGuide/Monitor-Alert/Metric-Tool.md
@@ -124,7 +124,7 @@ carefully evaluated. The current Core-level metrics are as follows:
 #### 4.1.2. Interface
 
 | Metric                | Tags                               | Type      | Description                                                    |
-| --------------------- |------------------------------------| --------- | -------------------------------------------------------------- |
+| --------------------- | ---------------------------------- | --------- | -------------------------------------------------------------- |
 | thrift_connections    | name="ConfigNodeRPC"               | AutoGauge | The number of thrift internal connections in ConfigNode        |
 | thrift_connections    | name="InternalRPC"                 | AutoGauge | The number of thrift internal connections in DataNode          |
 | thrift_connections    | name="MPPDataExchangeRPC"          | AutoGauge | The number of thrift internal connections in MPP               |
@@ -152,14 +152,18 @@ carefully evaluated. The current Core-level metrics are as follows:
 | performance_overview_detail          | stage="analyzer"                                 | Timer | The time consumed on analyzing statement         |
 | performance_overview_detail          | stage="planner"                                  | Timer | The time consumed on planning                    |
 | performance_overview_detail          | stage="scheduler"                                | Timer | The time consumed on scheduling                  |
-| performance_overview_schedule_detail | stage="schema_validate"                          | Timer | The time consumed on schema validation           |
-| performance_overview_schedule_detail | stage="trigger"                                  | Timer | The time consumed on trigger                     |
-| performance_overview_schedule_detail | stage="consensus"                                | Timer | The time consumed on consensus                   |
-| performance_overview_schedule_detail | stage="lock"                                     | Timer | The time consumed on grabbing lock in DataRegion |
-| performance_overview_schedule_detail | stage="memory_block"                             | Timer | The time consumed on insert memory control       |
-| performance_overview_schedule_detail | stage="wal"                                      | Timer | The time consumed on writing wal                 |
-| performance_overview_schedule_detail | stage="memtable"                                 | Timer | The time consumed on writing memtable            |
-| performance_overview_schedule_detail | stage="last_cache"                               | Timer | The time consumed on updating last cache         |
+| performance_overview_schedule_detail | stage="local_scheduler"                          | Timer | The time consumed on local scheduler             |
+| performance_overview_schedule_detail | stage="remote_scheduler"                         | Timer | The time consumed on remote scheduler            |
+| performance_overview_local_detail    | stage="schema_validate"                          | Timer | The time consumed on schema validation           |
+| performance_overview_local_detail    | stage="trigger"                                  | Timer | The time consumed on trigger                     |
+| performance_overview_local_detail    | stage="storage"                                  | Timer | The time consumed on consensus                   |
+| performance_overview_storage_detail  | stage="engine"                                   | Timer | The time consumed on write stateMachine          |
+| performance_overview_engine_detail   | stage="lock"                                     | Timer | The time consumed on grabbing lock in DataRegion |
+| performance_overview_engine_detail   | stage="create_memtable_block"                    | Timer | The time consumed on creating new memtable       |
+| performance_overview_engine_detail   | stage="memory_block"                             | Timer | The time consumed on insert memory control       |
+| performance_overview_engine_detail   | stage="wal"                                      | Timer | The time consumed on writing wal                 |
+| performance_overview_engine_detail   | stage="memtable"                                 | Timer | The time consumed on writing memtable            |
+| performance_overview_engine_detail   | stage="last_cache"                               | Timer | The time consumed on updating last cache         |
 
 #### 4.1.5. Task Statistics
 
@@ -301,14 +305,14 @@ carefully evaluated. The current Core-level metrics are as follows:
 
 #### 4.2.4. Memory
 
-| Metric | Tags                                 | Type      | Description                                                        |
-| ------ | ------------------------------------ | --------- | ------------------------------------------------------------------ |
-| mem    | name="database_{name}"               | AutoGauge | The memory usage of DataRegion in DataNode, Unit: byte             |
-| mem    | name="chunkMetaData_{name}"          | AutoGauge | The memory usage of chunkMetaData when writting TsFile, Unit: byte |
-| mem    | name="IoTConsensus"                  | AutoGauge | The memory usage of IoTConsensus, Unit: byte                       |
-| mem    | name="IoTConsensusQueue"             | AutoGauge | The memory usage of IoTConsensus Queue, Unit: byte                 |
-| mem    | name="IoTConsensusSync"              | AutoGauge | The memory usage of IoTConsensus SyncStatus, Unit: byte            |
-| mem    | name="schema_region_total_usage"     | AutoGauge | The memory usage of all SchemaRegion, Unit: byte                   |
+| Metric | Tags                             | Type      | Description                                                        |
+| ------ | -------------------------------- | --------- | ------------------------------------------------------------------ |
+| mem    | name="database_{name}"           | AutoGauge | The memory usage of DataRegion in DataNode, Unit: byte             |
+| mem    | name="chunkMetaData_{name}"      | AutoGauge | The memory usage of chunkMetaData when writting TsFile, Unit: byte |
+| mem    | name="IoTConsensus"              | AutoGauge | The memory usage of IoTConsensus, Unit: byte                       |
+| mem    | name="IoTConsensusQueue"         | AutoGauge | The memory usage of IoTConsensus Queue, Unit: byte                 |
+| mem    | name="IoTConsensusSync"          | AutoGauge | The memory usage of IoTConsensus SyncStatus, Unit: byte            |
+| mem    | name="schema_region_total_usage" | AutoGauge | The memory usage of all SchemaRegion, Unit: byte                   |
 
 #### 4.2.5. Compaction
 
@@ -418,16 +422,45 @@ carefully evaluated. The current Core-level metrics are as follows:
 
 #### 4.2.16 Schema Engine
 
-| Metric        | Tags                                                         | Type      | Description                            |
-| ------------- | ------------------------------------------------------------ | --------- | -------------------------------------- |
-| schema_engine | name="schema_region_total_mem_usage"                         | AutoGauge | Memory usgae for all SchemaRegion      |
-| schema_engine | name="schema_region_mem_capacity"                            | AutoGauge | Memory capacity for all SchemaRegion   |
-| schema_engine | name="schema_engine_mode"                                    | Gauge     | Mode of SchemaEngine                   |
-| schema_engine | name="schema_region_consensus"                               | Gauge     | Consensus protocol of SchemaRegion     |
-| schema_engine | name="schema_region_number"                                  | AutoGauge | Number of SchemaRegion                 |
-| schema_region | name="schema_region_mem_usage", region="SchemaRegion[{regionId}]" | AutoGauge | Memory usgae for each SchemaRegion     |
+| Metric        | Tags                                                               | Type      | Description                            |
+| ------------- | ------------------------------------------------------------------ | --------- | -------------------------------------- |
+| schema_engine | name="schema_region_total_mem_usage"                               | AutoGauge | Memory usgae for all SchemaRegion      |
+| schema_engine | name="schema_region_mem_capacity"                                  | AutoGauge | Memory capacity for all SchemaRegion   |
+| schema_engine | name="schema_engine_mode"                                          | Gauge     | Mode of SchemaEngine                   |
+| schema_engine | name="schema_region_consensus"                                     | Gauge     | Consensus protocol of SchemaRegion     |
+| schema_engine | name="schema_region_number"                                        | AutoGauge | Number of SchemaRegion                 |
+| schema_region | name="schema_region_mem_usage", region="SchemaRegion[{regionId}]"  | AutoGauge | Memory usgae for each SchemaRegion     |
 | schema_region | name="schema_region_series_cnt", region="SchemaRegion[{regionId}]" | AutoGauge | Timeseries count for each SchemaRegion |
 
+#### 4.2.17 Write Performance
+
+| Metric                    | Tags                                                                  | Type      | Description                                            |
+| ------------------------- | :-------------------------------------------------------------------- | --------- | ------------------------------------------------------ |
+| wal_node_num              | name="wal_nodes_num"                                                  | AutoGauge | Num of WALNode                                         |
+| wal_cost                  | stage="make_checkpoint"  type="<checkpoint_type>"                     | Timer     | Time cost of make checkpoints for all checkpoint type  |
+| wal_cost                  | type="serialize_one_wal_info_entry"                                   | Timer     | Time cost of serialize one WALInfoEntry                |
+| wal_cost                  | stage="sync_wal_buffer" type="<force_flag>"                           | Timer     | Time cost of sync WALBuffer                            |
+| wal_buffer                | name="used_ratio"                                                     | Histogram | Used ratio of WALBuffer                                |
+| wal_cost                  | stage="serialize_wal_entry" type="serialize_wal_entry_total"          | Timer     | Time cost of WALBuffer serialize task                  |
+| wal_node_info             | name="effective_info_ratio" type="<wal_node_id>"                      | Histogram | Effective info ratio of WALNode                        |
+| wal_node_info             | name="oldest_mem_table_ram_when_cause_snapshot" type="<wal_node_id>"  | Histogram | Ram of oldest memTable when cause snapshot             |
+| wal_node_info             | name="oldest_mem_table_ram_when_cause_flush" type="<wal_node_id>"     | Histogram | Ram of oldest memTable when cause flush                |
+| flush_sub_task_cost       | type="sort_task"                                                      | Timer     | Time cost of sort series in flush sort stage           |
+| flush_sub_task_cost       | type="encoding_task"                                                  | Timer     | Time cost of sub encoding task in flush encoding stage |
+| flush_sub_task_cost       | type="io_task"                                                        | Timer     | Time cost of sub io task in flush io stage             |
+| flush_cost                | stage="write_plan_indices"                                            | Timer     | Time cost of write plan indices                        |
+| flush_cost                | stage="sort"                                                          | Timer     | Time cost of flush sort stage                          |
+| flush_cost                | stage="encoding"                                                      | Timer     | Time cost of flush encoding stage                      |
+| flush_cost                | stage="io"                                                            | Timer     | Time cost of flush io stage                            |
+| pending_flush_task        | type="pending_task_num"                                               | AutoGauge | Num of pending flush task num                          |
+| pending_flush_task        | type="pending_sub_task_num"                                           | AutoGauge | Num of pending flush sub task num                      |
+| flushing_mem_table_status | name="mem_table_size" region="DataRegion[<data_region_id>]"           | Histogram | Size of flushing memTable                              |
+| flushing_mem_table_status | name="total_point_num" region="DataRegion[<data_region_id>]"          | Histogram | Point num of flushing memTable                         |
+| flushing_mem_table_status | name="series_num" region="DataRegion[<data_region_id>]"               | Histogram | Series num of flushing memTable                        |
+| flushing_mem_table_status | name="avg_series_points_num" region="DataRegion[<data_region_id>]"    | Histogram | Point num of flushing memChunk                         |
+| flushing_mem_table_status | name="tsfile_compression_ratio" region="DataRegion[<data_region_id>]" | Histogram | TsFile Compression ratio of flushing memTable          |
+| flushing_mem_table_status | name="flush_tsfile_size" region="DataRegion[<data_region_id>]"        | Histogram | TsFile size of flushing memTable                       |
+
 ### 4.3. Normal level Metrics
 
 #### 4.3.1. Cluster
@@ -478,13 +511,13 @@ the sidebar `org.apache.iotdb.db.service` to view the cache hit ratio:
 > For metrics whose Metric Name is name and Tags are K1=V1, ..., Kn=Vn, the mapping is as follows, where value is a
 > specific value
 
-| Metric Type      | Mapping                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 [...]
-| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
-| Counter          | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value                                                                                                                                                                                                                                                                                                                                                                                    [...]
-| AutoGauge、Gauge | name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value                                                                                                                                                                                                                                                                                                                                                                                           [...]
-| Histogram        | name_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", quantile="0.0"} value <br> name{cluster="clusterName", nodeType="nod [...]
-| Rate             | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m1"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m5"} value  <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m15"} value <br> name_total{c [...]
-| Timer            | name_seconds_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", quantile="0.0"} value <br> name_seco [...]
+| Metric Type      | Mapping                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 [...]
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| Counter          | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value                                                                                                                                                                                                                                                                                                                                                                                    [...]
+| AutoGauge、Gauge | name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value                                                                                                                                                                                                                                                                                                                                                                                           [...]
+| Histogram        | name_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", quantile="0.0"} value <br> name{cluster="clusterName", nodeType="nod [...]
+| Rate             | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m1"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m5"} value  <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", rate="m15"} value <br> name_total{c [...]
+| Timer            | name_seconds_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn"} value <br> name_seconds{cluster="clusterName", nodeType="nodeType", nodeId="nodeId", k1="V1", ..., Kn="Vn", quantile="0.0"} value <br> name_seco [...]
 
 #### 5.2.2. Config File
 
@@ -760,12 +793,12 @@ data source for Apache IoTDB Dashboard.
 > For metrics whose Metric Name is name and Tags are K1=V1, ..., Kn=Vn, the mapping is as follows, taking root.__
 > system.metric.`clusterName`.`nodeType`.`nodeId` as an example by default
 
-| Metric Type      | Mapping                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 [...]
-| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
-| Counter          | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value                                                                                                                                                                                                                                                                                                                                                                                                     [...]
-| AutoGauge、Gauge | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value                                                                                                                                                                                                                                                                                                                                                                                                      [...]
-| Histogram        | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p50 <br> root.__system.metric.`clusterName`. [...]
-| Rate             | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m1 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m5 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m15                                          [...]
+| Metric Type      | Mapping                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 [...]
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| Counter          | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value                                                                                                                                                                                                                                                                                                                                                                                                     [...]
+| AutoGauge、Gauge | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value                                                                                                                                                                                                                                                                                                                                                                                                      [...]
+| Histogram        | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p50 <br> root.__system.metric.`clusterName`. [...]
+| Rate             | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m1 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m5 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m15                                          [...]
 | Timer            | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName` [...]
 
 #### 5.3.2. Obtain metrics
diff --git a/docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md b/docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md
index 9ea70137c2..e09b74ac4b 100644
--- a/docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md
+++ b/docs/zh/UserGuide/Monitor-Alert/Metric-Tool.md
@@ -103,7 +103,7 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
 #### 4.1.2. 接口层统计
 
 | Metric                | Tags                               | Type      | Description                         |
-| --------------------- |------------------------------------| --------- | ----------------------------------- |
+| --------------------- | ---------------------------------- | --------- | ----------------------------------- |
 | thrift_connections    | name="ConfigNodeRPC"               | AutoGauge | ConfigNode 的内部 Thrift 连接数     |
 | thrift_connections    | name="InternalRPC"                 | AutoGauge | DataNode 的内部 Thrift 连接数       |
 | thrift_connections    | name="MPPDataExchangeRPC"          | AutoGauge | MPP 框架的内部 Thrift 连接数        |
@@ -131,14 +131,18 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
 | performance_overview_detail          | stage="analyzer"                                 | Timer | 语句分析总耗时             |
 | performance_overview_detail          | stage="planner"                                  | Timer | 请求规划总耗时             |
 | performance_overview_detail          | stage="scheduler"                                | Timer | 请求执行总耗时             |
-| performance_overview_schedule_detail | stage="schema_validate"                          | Timer | 元数据验证总耗时           |
-| performance_overview_schedule_detail | stage="trigger"                                  | Timer | Trigger 触发总耗时         |
-| performance_overview_schedule_detail | stage="consensus"                                | Timer | 共识层总耗时               |
-| performance_overview_schedule_detail | stage="lock"                                     | Timer | DataRegion 抢锁总耗时      |
-| performance_overview_schedule_detail | stage="memory_block"                             | Timer | 内存控制阻塞总耗时         |
-| performance_overview_schedule_detail | stage="wal"                                      | Timer | 写入 Wal 总耗时            |
-| performance_overview_schedule_detail | stage="memtable"                                 | Timer | 写入 Memtable 总耗时       |
-| performance_overview_schedule_detail | stage="last_cache"                               | Timer | 更新 LastCache 总耗时      |
+| performance_overview_schedule_detail | stage="local_scheduler"                          | Timer | 本地请求执行总耗时         |
+| performance_overview_schedule_detail | stage="remote_scheduler"                         | Timer | 远程请求执行总耗时         |
+| performance_overview_local_detail    | stage="schema_validate"                          | Timer | 元数据验证总耗时           |
+| performance_overview_local_detail    | stage="trigger"                                  | Timer | Trigger 触发总耗时         |
+| performance_overview_local_detail    | stage="storage"                                  | Timer | 共识层总耗时               |
+| performance_overview_storage_detail  | stage="engine"                                   | Timer | DataRegion 抢锁总耗时      |
+| performance_overview_engine_detail   | stage="lock"                                     | Timer | DataRegion 抢锁总耗时      |
+| performance_overview_engine_detail   | stage="create_memtable_block"                    | Timer | 创建新的 Memtable 耗时     |
+| performance_overview_engine_detail   | stage="memory_block"                             | Timer | 内存控制阻塞总耗时         |
+| performance_overview_engine_detail   | stage="wal"                                      | Timer | 写入 Wal 总耗时            |
+| performance_overview_engine_detail   | stage="memtable"                                 | Timer | 写入 Memtable 总耗时       |
+| performance_overview_engine_detail   | stage="last_cache"                               | Timer | 更新 LastCache 总耗时      |
 
 #### 4.1.5. 任务统计
 
@@ -280,14 +284,14 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
 | cache     | name="DataPartition", type="all"   | Counter   | DataPartition Cache 的访问次数                          |
 
 #### 4.2.4. 内存统计
-| Metric | Tags                                 | Type      | Description                                       |
-| ------ | ------------------------------------ | --------- | ------------------------------------------------- |
-| mem    | name="database_{name}"               | AutoGauge | DataNode内对应DataRegion的内存占用,单位为byte    |
-| mem    | name="chunkMetaData_{name}"          | AutoGauge | 写入TsFile时的ChunkMetaData的内存占用,单位为byte |
-| mem    | name="IoTConsensus"                  | AutoGauge | IoT共识协议的内存占用,单位为byte                 |
-| mem    | name="IoTConsensusQueue"             | AutoGauge | IoT共识协议用于队列的内存占用,单位为byte         |
-| mem    | name="IoTConsensusSync"              | AutoGauge | IoT共识协议用于同步的内存占用,单位为byte         |
-| mem    | name="schema_region_total_usage"     | AutoGauge | 所有SchemaRegion的总内存占用,单位为byte          |
+| Metric | Tags                             | Type      | Description                                       |
+| ------ | -------------------------------- | --------- | ------------------------------------------------- |
+| mem    | name="database_{name}"           | AutoGauge | DataNode内对应DataRegion的内存占用,单位为byte    |
+| mem    | name="chunkMetaData_{name}"      | AutoGauge | 写入TsFile时的ChunkMetaData的内存占用,单位为byte |
+| mem    | name="IoTConsensus"              | AutoGauge | IoT共识协议的内存占用,单位为byte                 |
+| mem    | name="IoTConsensusQueue"         | AutoGauge | IoT共识协议用于队列的内存占用,单位为byte         |
+| mem    | name="IoTConsensusSync"          | AutoGauge | IoT共识协议用于同步的内存占用,单位为byte         |
+| mem    | name="schema_region_total_usage" | AutoGauge | 所有SchemaRegion的总内存占用,单位为byte          |
 
 #### 4.2.5. 合并统计
 
@@ -397,15 +401,15 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
 
 #### 4.2.16 元数据引擎统计
 
-| Metric        | Tags                                                         | Type      | Description                                    |
-| ------------- | ------------------------------------------------------------ | --------- | ---------------------------------------------- |
-| schema_engine | name="schema_region_total_mem_usage"                         | AutoGauge | SchemaRegion 全局内存使用量                    |
-| schema_engine | name="schema_region_mem_capacity"                            | AutoGauge | SchemaRegion 全局可用内存                      |
-| schema_engine | name="schema_engine_mode"                                    | Gauge     | SchemaEngine 模式                              |
-| schema_engine | name="schema_region_consensus"                               | Gauge     | 元数据管理引擎共识协议                         |
-| schema_engine | name="schema_region_number"                                  | AutoGauge | SchemaRegion 个数                              |
-| schema_region | name="schema_region_mem_usage", region="SchemaRegion[{regionId}]" | AutoGauge | 每个 SchemaRegion 分别的内存使用量             |
-| schema_region | name="schema_region_series_cnt", region="SchemaRegion[{regionId}]" | AutoGauge | 每个 SchemaRegion 分别的时间序列数             |
+| Metric        | Tags                                                               | Type      | Description                        |
+| ------------- | ------------------------------------------------------------------ | --------- | ---------------------------------- |
+| schema_engine | name="schema_region_total_mem_usage"                               | AutoGauge | SchemaRegion 全局内存使用量        |
+| schema_engine | name="schema_region_mem_capacity"                                  | AutoGauge | SchemaRegion 全局可用内存          |
+| schema_engine | name="schema_engine_mode"                                          | Gauge     | SchemaEngine 模式                  |
+| schema_engine | name="schema_region_consensus"                                     | Gauge     | 元数据管理引擎共识协议             |
+| schema_engine | name="schema_region_number"                                        | AutoGauge | SchemaRegion 个数                  |
+| schema_region | name="schema_region_mem_usage", region="SchemaRegion[{regionId}]"  | AutoGauge | 每个 SchemaRegion 分别的内存使用量 |
+| schema_region | name="schema_region_series_cnt", region="SchemaRegion[{regionId}]" | AutoGauge | 每个 SchemaRegion 分别的时间序列数 |
 
 ### 4.3. Normal 级别监控指标
 
@@ -452,13 +456,13 @@ Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别
 
 > 对于 Metric Name 为 name, Tags 为 K1=V1, ..., Kn=Vn 的监控指标有如下映射,其中 value 为具体值
 
-| 监控指标类型     | 映射关系                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          [...]
-| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
-| Counter          | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value                                                                                                                                                                                                                                                                                                                                                                                    [...]
-| AutoGauge、Gauge | name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value                                                                                                                                                                                                                                                                                                                                                                                           [...]
-| Histogram        | name_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", quantile="0.0"} value <br> name{cluster="clusterName", nodeType="nod [...]
-| Rate             | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m1"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m5"} value  <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m15"} value <br> name_total{c [...]
-| Timer            | name_seconds_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", quantile="0.0"} value <br> name_seco [...]
+| 监控指标类型     | 映射关系                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          [...]
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| Counter          | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value                                                                                                                                                                                                                                                                                                                                                                                    [...]
+| AutoGauge、Gauge | name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value                                                                                                                                                                                                                                                                                                                                                                                           [...]
+| Histogram        | name_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", quantile="0.0"} value <br> name{cluster="clusterName", nodeType="nod [...]
+| Rate             | name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m1"} value <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m5"} value  <br> name_total{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", rate="m15"} value <br> name_total{c [...]
+| Timer            | name_seconds_max{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds_sum{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds_count{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn"} value <br> name_seconds{cluster="clusterName", nodeType="nodeType", nodeId="nodeId",k1="V1" , ..., Kn="Vn", quantile="0.0"} value <br> name_seco [...]
 
 #### 5.2.2. 修改配置文件
 
@@ -709,12 +713,12 @@ static_configs:
 
 > 对于 Metric Name 为 name, Tags 为 K1=V1, ..., Kn=Vn 的监控指标有如下映射,以默认写到 root.__system.metric.`clusterName`.`nodeType`.`nodeId` 为例
 
-| 监控指标类型     | 映射关系                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          [...]
-| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
-| Counter          | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value                                                                                                                                                                                                                                                                                                                                                                                                     [...]
-| AutoGauge、Gauge | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value                                                                                                                                                                                                                                                                                                                                                                                                      [...]
-| Histogram        | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p50 <br> root.__system.metric.`clusterName`. [...]
-| Rate             | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m1 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m5 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m15                                          [...]
+| 监控指标类型     | 映射关系                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          [...]
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| Counter          | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value                                                                                                                                                                                                                                                                                                                                                                                                     [...]
+| AutoGauge、Gauge | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.value                                                                                                                                                                                                                                                                                                                                                                                                      [...]
+| Histogram        | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p50 <br> root.__system.metric.`clusterName`. [...]
+| Rate             | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m1 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m5 <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.m15                                          [...]
 | Timer            | root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.count <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.max <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.mean <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.sum <br> root.__system.metric.`clusterName`.`nodeType`.`nodeId`.name.`K1=V1`...`Kn=Vn`.p0 <br> root.__system.metric.`clusterName` [...]
 
 #### 5.3.2. 获取监控指标
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/Metric.java b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/Metric.java
index efc66b7ffb..075a882788 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/Metric.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/Metric.java
@@ -87,6 +87,18 @@ public enum Metric {
   PERFORMANCE_OVERVIEW,
   PERFORMANCE_OVERVIEW_DETAIL,
   PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+  PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
+  PERFORMANCE_OVERVIEW_STORAGE_DETAIL,
+  PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+  WAL_NODE_NUM,
+  WAL_NODE_INFO,
+  WAL_BUFFER,
+  PENDING_FLUSH_TASK,
+  WAL_COST,
+  FLUSH_COST,
+  FLUSH_SUB_TASK_COST,
+  FLUSHING_MEM_TABLE_STATUS,
+  DATA_REGION_MEM_COST,
   SCHEMA_REGION,
   SCHEMA_ENGINE,
   SESSION_IDLE_TIME;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetrics.java b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/PerformanceOverviewMetrics.java
similarity index 68%
rename from server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetrics.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/PerformanceOverviewMetrics.java
index 0c7b437470..9b59cefc7d 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetrics.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/service/metric/enums/PerformanceOverviewMetrics.java
@@ -17,10 +17,8 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.mpp.metric;
+package org.apache.iotdb.commons.service.metric.enums;
 
-import org.apache.iotdb.commons.service.metric.enums.Metric;
-import org.apache.iotdb.commons.service.metric.enums.Tag;
 import org.apache.iotdb.metrics.AbstractMetricService;
 import org.apache.iotdb.metrics.metricsets.IMetricSet;
 import org.apache.iotdb.metrics.utils.MetricInfo;
@@ -65,62 +63,102 @@ public class PerformanceOverviewMetrics implements IMetricSet {
 
   private static final String PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL =
       Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString();
+  public static final String LOCAL_SCHEDULE = "local_scheduler";
+  public static final String REMOTE_SCHEDULE = "remote_scheduler";
 
+  static {
+    metricInfoMap.put(
+        LOCAL_SCHEDULE,
+        new MetricInfo(
+            MetricType.TIMER,
+            PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+            Tag.STAGE.toString(),
+            LOCAL_SCHEDULE));
+    metricInfoMap.put(
+        REMOTE_SCHEDULE,
+        new MetricInfo(
+            MetricType.TIMER,
+            PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+            Tag.STAGE.toString(),
+            REMOTE_SCHEDULE));
+  }
+
+  private static final String PERFORMANCE_OVERVIEW_LOCAL_DETAIL =
+      Metric.PERFORMANCE_OVERVIEW_LOCAL_DETAIL.toString();
   public static final String SCHEMA_VALIDATE = "schema_validate";
   public static final String TRIGGER = "trigger";
-  public static final String CONSENSUS = "consensus";
-  public static final String LOCK = "lock";
-  public static final String MEMORY_BLOCK = "memory_block";
-  public static final String WAL = "wal";
-  public static final String MEMTABLE = "memtable";
-  public static final String LAST_CACHE = "last_cache";
+  public static final String STORAGE = "storage";
 
   static {
     metricInfoMap.put(
         SCHEMA_VALIDATE,
         new MetricInfo(
             MetricType.TIMER,
-            PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+            PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
             Tag.STAGE.toString(),
             SCHEMA_VALIDATE));
     metricInfoMap.put(
         TRIGGER,
         new MetricInfo(
-            MetricType.TIMER, PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL, Tag.STAGE.toString(), TRIGGER));
+            MetricType.TIMER, PERFORMANCE_OVERVIEW_LOCAL_DETAIL, Tag.STAGE.toString(), TRIGGER));
     metricInfoMap.put(
-        CONSENSUS,
+        STORAGE,
         new MetricInfo(
-            MetricType.TIMER,
-            PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
-            Tag.STAGE.toString(),
-            CONSENSUS));
+            MetricType.TIMER, PERFORMANCE_OVERVIEW_LOCAL_DETAIL, Tag.STAGE.toString(), STORAGE));
+  }
+
+  private static final String PERFORMANCE_OVERVIEW_STORAGE_DETAIL =
+      Metric.PERFORMANCE_OVERVIEW_STORAGE_DETAIL.toString();
+  public static final String ENGINE = "engine";
+
+  static {
+    metricInfoMap.put(
+        ENGINE,
+        new MetricInfo(
+            MetricType.TIMER, PERFORMANCE_OVERVIEW_STORAGE_DETAIL, Tag.STAGE.toString(), ENGINE));
+  }
+
+  private static final String PERFORMANCE_OVERVIEW_ENGINE_DETAIL =
+      Metric.PERFORMANCE_OVERVIEW_ENGINE_DETAIL.toString();
+  public static final String LOCK = "lock";
+  public static final String MEMORY_BLOCK = "memory_block";
+  public static final String CREATE_MEMTABLE_BLOCK = "create_memtable_block";
+  public static final String WAL = "wal";
+  public static final String MEMTABLE = "memtable";
+  public static final String LAST_CACHE = "last_cache";
+
+  static {
     metricInfoMap.put(
         LOCK,
         new MetricInfo(
-            MetricType.TIMER, PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL, Tag.STAGE.toString(), LOCK));
+            MetricType.TIMER, PERFORMANCE_OVERVIEW_ENGINE_DETAIL, Tag.STAGE.toString(), LOCK));
+    metricInfoMap.put(
+        CREATE_MEMTABLE_BLOCK,
+        new MetricInfo(
+            MetricType.TIMER,
+            PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+            Tag.STAGE.toString(),
+            CREATE_MEMTABLE_BLOCK));
     metricInfoMap.put(
         MEMORY_BLOCK,
         new MetricInfo(
             MetricType.TIMER,
-            PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+            PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
             Tag.STAGE.toString(),
             MEMORY_BLOCK));
     metricInfoMap.put(
         WAL,
         new MetricInfo(
-            MetricType.TIMER, PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL, Tag.STAGE.toString(), WAL));
+            MetricType.TIMER, PERFORMANCE_OVERVIEW_ENGINE_DETAIL, Tag.STAGE.toString(), WAL));
     metricInfoMap.put(
         MEMTABLE,
         new MetricInfo(
-            MetricType.TIMER,
-            PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
-            Tag.STAGE.toString(),
-            MEMTABLE));
+            MetricType.TIMER, PERFORMANCE_OVERVIEW_ENGINE_DETAIL, Tag.STAGE.toString(), MEMTABLE));
     metricInfoMap.put(
         LAST_CACHE,
         new MetricInfo(
             MetricType.TIMER,
-            PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+            PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
             Tag.STAGE.toString(),
             LAST_CACHE));
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java b/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
index c661c27421..62738656df 100644
--- a/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
+++ b/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
@@ -122,7 +122,7 @@ public class AuthorityChecker {
       return onQueryException(
           e, OperationType.CHECK_AUTHORITY.getName(), TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
-      PerformanceOverviewMetricsManager.getInstance().recordAuthCost(System.nanoTime() - startTime);
+      PerformanceOverviewMetricsManager.recordAuthCost(System.nanoTime() - startTime);
     }
     return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/DataRegionStateMachine.java b/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/DataRegionStateMachine.java
index 8fb012081b..4ce6d3fd9d 100644
--- a/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/DataRegionStateMachine.java
+++ b/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/DataRegionStateMachine.java
@@ -37,7 +37,6 @@ import org.apache.iotdb.db.engine.snapshot.SnapshotLoader;
 import org.apache.iotdb.db.engine.snapshot.SnapshotTaker;
 import org.apache.iotdb.db.engine.storagegroup.DataRegion;
 import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceManager;
-import org.apache.iotdb.db.mpp.metric.PerformanceOverviewMetricsManager;
 import org.apache.iotdb.db.mpp.plan.planner.plan.FragmentInstance;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertMultiTabletsNode;
@@ -239,12 +238,7 @@ public class DataRegionStateMachine extends BaseStateMachine {
   @Override
   public TSStatus write(IConsensusRequest request) {
     try {
-      PlanNode planNode = (PlanNode) request;
-      if (planNode.getMetricTime() != 0) {
-        PerformanceOverviewMetricsManager.getInstance()
-            .recordScheduleConsensusCost(System.nanoTime() - planNode.getMetricTime());
-      }
-      return write(planNode);
+      return write((PlanNode) request);
     } catch (IllegalArgumentException e) {
       logger.error(e.getMessage(), e);
       return new TSStatus(TSStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
diff --git a/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/IoTConsensusDataRegionStateMachine.java b/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/IoTConsensusDataRegionStateMachine.java
index 3ccb5de8c8..26d52eed22 100644
--- a/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/IoTConsensusDataRegionStateMachine.java
+++ b/server/src/main/java/org/apache/iotdb/db/consensus/statemachine/IoTConsensusDataRegionStateMachine.java
@@ -27,7 +27,6 @@ import org.apache.iotdb.consensus.common.request.IConsensusRequest;
 import org.apache.iotdb.consensus.common.request.IndexedConsensusRequest;
 import org.apache.iotdb.consensus.common.request.IoTConsensusRequest;
 import org.apache.iotdb.db.engine.storagegroup.DataRegion;
-import org.apache.iotdb.db.mpp.metric.PerformanceOverviewMetricsManager;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
 import org.apache.iotdb.db.wal.buffer.WALEntry;
@@ -58,12 +57,7 @@ public class IoTConsensusDataRegionStateMachine extends DataRegionStateMachine {
         }
         return new TSStatus().setSubStatus(subStatus);
       } else {
-        PlanNode planNode = (PlanNode) request;
-        if (planNode.getMetricTime() != 0) {
-          PerformanceOverviewMetricsManager.getInstance()
-              .recordScheduleConsensusCost(System.nanoTime() - planNode.getMetricTime());
-        }
-        return write(planNode);
+        return write((PlanNode) request);
       }
     } catch (IllegalArgumentException e) {
       logger.error(e.getMessage(), e);
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
index 7f2a19a410..9fe0e3346f 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.engine.storagegroup;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
@@ -168,7 +169,7 @@ public class DataRegion implements IDataRegionForQuery {
 
   /**
    * All newly generated chunks after merge have version number 0, so we set merged Modification
-   * file version to 1 to take effect
+   * file version to 1 to take effect.
    */
   private static final int MERGE_MOD_START_VERSION_NUM = 1;
 
@@ -185,9 +186,9 @@ public class DataRegion implements IDataRegionForQuery {
    * partitionLatestFlushedTimeForEachDevice)
    */
   private final ReadWriteLock insertLock = new ReentrantReadWriteLock();
-  /** condition to safely delete data region */
+  /** condition to safely delete data region. */
   private final Condition deletedCondition = insertLock.writeLock().newCondition();
-  /** data region has been deleted or not */
+  /** data region has been deleted or not. */
   private volatile boolean deleted = false;
   /** closeStorageGroupCondition is used to wait for all currently closing TsFiles to be done. */
   private final Object closeStorageGroupCondition = new Object();
@@ -195,53 +196,54 @@ public class DataRegion implements IDataRegionForQuery {
    * avoid some tsfileResource is changed (e.g., from unsealed to sealed) when a query is executed.
    */
   private final ReadWriteLock closeQueryLock = new ReentrantReadWriteLock();
-  /** time partition id in the database -> tsFileProcessor for this time partition */
+  /** time partition id in the database -> tsFileProcessor for this time partition. */
   private final TreeMap<Long, TsFileProcessor> workSequenceTsFileProcessors = new TreeMap<>();
-  /** time partition id in the database -> tsFileProcessor for this time partition */
+  /** time partition id in the database -> tsFileProcessor for this time partition. */
   private final TreeMap<Long, TsFileProcessor> workUnsequenceTsFileProcessors = new TreeMap<>();
 
   // upgrading sequence TsFile resource list
-  private List<TsFileResource> upgradeSeqFileList = new LinkedList<>();
-  /** sequence tsfile processors which are closing */
-  private CopyOnReadLinkedList<TsFileProcessor> closingSequenceTsFileProcessor =
+  private final List<TsFileResource> upgradeSeqFileList = new LinkedList<>();
+  /** sequence tsfile processors which are closing. */
+  private final CopyOnReadLinkedList<TsFileProcessor> closingSequenceTsFileProcessor =
       new CopyOnReadLinkedList<>();
-  // upgrading unsequence TsFile resource list
-  private List<TsFileResource> upgradeUnseqFileList = new LinkedList<>();
+  /** upgrading unsequence TsFile resource list. */
+  private final List<TsFileResource> upgradeUnseqFileList = new LinkedList<>();
 
-  /** unsequence tsfile processors which are closing */
-  private CopyOnReadLinkedList<TsFileProcessor> closingUnSequenceTsFileProcessor =
+  /** unsequence tsfile processors which are closing. */
+  private final CopyOnReadLinkedList<TsFileProcessor> closingUnSequenceTsFileProcessor =
       new CopyOnReadLinkedList<>();
 
-  private AtomicInteger upgradeFileCount = new AtomicInteger();
+  private final AtomicInteger upgradeFileCount = new AtomicInteger();
 
-  private AtomicBoolean isSettling = new AtomicBoolean();
+  private final AtomicBoolean isSettling = new AtomicBoolean();
 
-  /** data region id */
-  private String dataRegionId;
-  /** database name */
-  private String databaseName;
-  /** database system directory */
+  /** data region id. */
+  private final String dataRegionId;
+  /** database name. */
+  private final String databaseName;
+  /** database system directory. */
   private File storageGroupSysDir;
-  /** manage seqFileList and unSeqFileList */
-  private TsFileManager tsFileManager;
+  /** manage seqFileList and unSeqFileList. */
+  private final TsFileManager tsFileManager;
 
-  /** manage tsFileResource degrade */
-  private TsFileResourceManager tsFileResourceManager = TsFileResourceManager.getInstance();
+  /** manage tsFileResource degrade. */
+  private final TsFileResourceManager tsFileResourceManager = TsFileResourceManager.getInstance();
 
   /**
    * time partition id -> version controller which assigns a version for each MemTable and
    * deletion/update such that after they are persisted, the order of insertions, deletions and
    * updates can be re-determined. Will be empty if there are not MemTables in memory.
    */
-  private HashMap<Long, VersionController> timePartitionIdVersionControllerMap = new HashMap<>();
+  private final HashMap<Long, VersionController> timePartitionIdVersionControllerMap =
+      new HashMap<>();
   /**
    * when the data in a database is older than dataTTL, it is considered invalid and will be
    * eventually removed.
    */
   private long dataTTL = Long.MAX_VALUE;
-  /** file system factory (local or hdfs) */
-  private FSFactory fsFactory = FSFactoryProducer.getFSFactory();
-  /** file flush policy */
+  /** file system factory (local or hdfs). */
+  private final FSFactory fsFactory = FSFactoryProducer.getFSFactory();
+  /** file flush policy. */
   private TsFileFlushPolicy fileFlushPolicy;
   /**
    * The max file versions in each partition. By recording this, if several IoTDB instances have the
@@ -250,20 +252,20 @@ public class DataRegion implements IDataRegionForQuery {
    * across different instances. partition number -> max version number
    */
   private Map<Long, Long> partitionMaxFileVersions = new HashMap<>();
-  /** database info for mem control */
+  /** database info for mem control. */
   private final DataRegionInfo dataRegionInfo = new DataRegionInfo(this);
-  /** whether it's ready from recovery */
+  /** whether it's ready from recovery. */
   private boolean isReady = false;
-  /** close file listeners */
+  /** close file listeners. */
   private List<CloseFileListener> customCloseFileListeners = Collections.emptyList();
-  /** flush listeners */
+  /** flush listeners. */
   private List<FlushListener> customFlushListeners = Collections.emptyList();
 
   private ILastFlushTimeMap lastFlushTimeMap;
 
   /**
    * record the insertWriteLock in SG is being hold by which method, it will be empty string if on
-   * one holds the insertWriteLock
+   * one holds the insertWriteLock.
    */
   private String insertWriteLockHolder = "";
 
@@ -273,10 +275,10 @@ public class DataRegion implements IDataRegionForQuery {
 
   private IDTable idTable;
 
-  private final QueryMetricsManager QUERY_METRICS = QueryMetricsManager.getInstance();
+  private final QueryMetricsManager queryMetricsManager = QueryMetricsManager.getInstance();
 
   /**
-   * constrcut a database processor
+   * construct a database processor.
    *
    * @param systemDir system dir path
    * @param dataRegionId data region id e.g. 1
@@ -300,7 +302,7 @@ public class DataRegion implements IDataRegionForQuery {
       logger.error("create database system Directory {} failed", storageGroupSysDir.getPath());
     }
 
-    // if use id table, we use id table flush time manager
+    // if you use id table, we use id table flush time manager
     if (config.isEnableIDTable()) {
       idTable = IDTableManager.getInstance().getIDTableDirectly(databaseName);
       lastFlushTimeMap = new IDTableLastFlushTimeMap(idTable, tsFileManager);
@@ -383,20 +385,20 @@ public class DataRegion implements IDataRegionForQuery {
     this.isSettling.set(isSettling);
   }
 
-  /** this class is used to store recovering context */
+  /** this class is used to store recovering context. */
   private class DataRegionRecoveryContext {
-    /** number of files to be recovered */
+    /** number of files to be recovered. */
     private final long numOfFilesToRecover;
-    /** when the change of recoveredFilesNum exceeds this, log check will be triggered */
+    /** when the change of recoveredFilesNum exceeds this, log check will be triggered. */
     private final long filesNumLogCheckTrigger;
-    /** number of already recovered files */
+    /** number of already recovered files. */
     private long recoveredFilesNum;
-    /** last recovery log time */
+    /** last recovery log time. */
     private long lastLogTime;
-    /** last recovery log files num */
+    /** last recovery log files num. */
     private long lastLogCheckFilesNum;
-    /** recover performers of unsealed TsFiles */
-    private List<UnsealedTsFileRecoverPerformer> recoverPerformers = new ArrayList<>();
+    /** recover performers of unsealed TsFiles. */
+    private final List<UnsealedTsFileRecoverPerformer> recoverPerformers = new ArrayList<>();
 
     public DataRegionRecoveryContext(long numOfFilesToRecover) {
       this.numOfFilesToRecover = numOfFilesToRecover;
@@ -630,7 +632,7 @@ public class DataRegion implements IDataRegionForQuery {
 
   /**
    * use old seq file to update latestTimeForEachDevice, globalLatestFlushedTimeForEachDevice,
-   * partitionLatestFlushedTimeForEachDevice and timePartitionIdVersionControllerMap
+   * partitionLatestFlushedTimeForEachDevice and timePartitionIdVersionControllerMap.
    */
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   private void updateLatestFlushedTime() throws IOException {
@@ -746,7 +748,7 @@ public class DataRegion implements IDataRegionForQuery {
     }
   }
 
-  /** check if the tsfile's time is smaller than system current time */
+  /** check if the tsfile's time is smaller than system current time. */
   private void checkTsFileTime(File tsFile) throws DataRegionException {
     String[] items = tsFile.getName().replace(TSFILE_SUFFIX, "").split(FILE_NAME_SEPARATOR);
     long fileTime = Long.parseLong(items[0]);
@@ -760,12 +762,12 @@ public class DataRegion implements IDataRegionForQuery {
     }
   }
 
-  /** submit unsealed TsFile to WALRecoverManager */
+  /** submit unsealed TsFile to WALRecoverManager. */
   private WALRecoverListener recoverUnsealedTsFile(
       TsFileResource unsealedTsFile, DataRegionRecoveryContext context, boolean isSeq) {
     UnsealedTsFileRecoverPerformer recoverPerformer =
         new UnsealedTsFileRecoverPerformer(
-            unsealedTsFile, isSeq, idTable, performer -> context.recoverPerformers.add(performer));
+            unsealedTsFile, isSeq, idTable, context.recoverPerformers::add);
     // remember to close UnsealedTsFileRecoverPerformer
     return WALRecoverManager.getInstance().addRecoverPerformer(recoverPerformer);
   }
@@ -839,7 +841,7 @@ public class DataRegion implements IDataRegionForQuery {
     }
   }
 
-  /** recover sealed TsFile */
+  /** recover sealed TsFile. */
   private void recoverSealedTsFiles(
       TsFileResource sealedTsFile, DataRegionRecoveryContext context, boolean isSeq) {
     try (SealedTsFileRecoverPerformer recoverPerformer =
@@ -884,7 +886,7 @@ public class DataRegion implements IDataRegionForQuery {
       TimePartitionManager.getInstance()
           .registerTimePartitionInfo(
               new TimePartitionInfo(
-                  new DataRegionId(Integer.valueOf(dataRegionId)),
+                  new DataRegionId(Integer.parseInt(dataRegionId)),
                   partitionId,
                   false,
                   Long.MAX_VALUE,
@@ -908,7 +910,7 @@ public class DataRegion implements IDataRegionForQuery {
   }
 
   /**
-   * insert one row of data
+   * insert one row of data.
    *
    * @param insertRowNode one row of data
    */
@@ -922,8 +924,7 @@ public class DataRegion implements IDataRegionForQuery {
     }
     long startTime = System.nanoTime();
     writeLock("InsertRow");
-    PerformanceOverviewMetricsManager.getInstance()
-        .recordScheduleLockCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordScheduleLockCost(System.nanoTime() - startTime);
     try {
       if (deleted) {
         return;
@@ -935,7 +936,7 @@ public class DataRegion implements IDataRegionForQuery {
         TimePartitionManager.getInstance()
             .registerTimePartitionInfo(
                 new TimePartitionInfo(
-                    new DataRegionId(Integer.valueOf(dataRegionId)),
+                    new DataRegionId(Integer.parseInt(dataRegionId)),
                     timePartitionId,
                     true,
                     Long.MAX_VALUE,
@@ -974,8 +975,7 @@ public class DataRegion implements IDataRegionForQuery {
     }
     long startTime = System.nanoTime();
     writeLock("insertTablet");
-    PerformanceOverviewMetricsManager.getInstance()
-        .recordScheduleLockCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordScheduleLockCost(System.nanoTime() - startTime);
     try {
       if (deleted) {
         return;
@@ -1023,7 +1023,7 @@ public class DataRegion implements IDataRegionForQuery {
         TimePartitionManager.getInstance()
             .registerTimePartitionInfo(
                 new TimePartitionInfo(
-                    new DataRegionId(Integer.valueOf(dataRegionId)),
+                    new DataRegionId(Integer.parseInt(dataRegionId)),
                     beforeTimePartition,
                     true,
                     Long.MAX_VALUE,
@@ -1068,8 +1068,8 @@ public class DataRegion implements IDataRegionForQuery {
           lastFlushTimeMap.getGlobalFlushedTime(insertTabletNode.getDevicePath().getFullPath());
       startTime = System.nanoTime();
       tryToUpdateBatchInsertLastCache(insertTabletNode, globalLatestFlushedTime);
-      PerformanceOverviewMetricsManager.getInstance()
-          .recordScheduleUpdateLastCacheCost(System.nanoTime() - startTime);
+      PerformanceOverviewMetricsManager.recordScheduleUpdateLastCacheCost(
+          System.nanoTime() - startTime);
 
       if (!noFailure) {
         throw new BatchProcessException(results);
@@ -1174,8 +1174,8 @@ public class DataRegion implements IDataRegionForQuery {
 
     long startTime = System.nanoTime();
     tryToUpdateInsertLastCache(insertRowNode, globalLatestFlushTime);
-    PerformanceOverviewMetricsManager.getInstance()
-        .recordScheduleUpdateLastCacheCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordScheduleUpdateLastCacheCost(
+        System.nanoTime() - startTime);
 
     // check memtable size and may asyncTryToFlush the work memtable
     if (tsFileProcessor.shouldFlush()) {
@@ -1719,8 +1719,8 @@ public class DataRegion implements IDataRegionForQuery {
               timeFilter,
               false);
 
-      QUERY_METRICS.recordQueryResourceNum(SEQUENCE_TSFILE, seqResources.size());
-      QUERY_METRICS.recordQueryResourceNum(UNSEQUENCE_TSFILE, unseqResources.size());
+      queryMetricsManager.recordQueryResourceNum(SEQUENCE_TSFILE, seqResources.size());
+      queryMetricsManager.recordQueryResourceNum(UNSEQUENCE_TSFILE, unseqResources.size());
 
       QueryDataSource dataSource = new QueryDataSource(seqResources, unseqResources);
       dataSource.setDataTTL(dataTTL);
@@ -3097,8 +3097,7 @@ public class DataRegion implements IDataRegionForQuery {
     }
     long startTime = System.nanoTime();
     writeLock("InsertRowsOfOneDevice");
-    PerformanceOverviewMetricsManager.getInstance()
-        .recordScheduleLockCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordScheduleLockCost(System.nanoTime() - startTime);
     try {
       if (deleted) {
         return;
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
index a7dace8019..2d078e4109 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
@@ -96,33 +96,33 @@ import static org.apache.iotdb.db.mpp.metric.QueryResourceMetricSet.WORKING_MEMT
 @SuppressWarnings("java:S1135") // ignore todos
 public class TsFileProcessor {
 
-  /** logger fot this class */
+  /** logger fot this class. */
   private static final Logger logger = LoggerFactory.getLogger(TsFileProcessor.class);
 
-  /** storgae group name of this tsfile */
+  /** storgae group name of this tsfile. */
   private final String storageGroupName;
 
-  /** IoTDB config */
+  /** IoTDB config. */
   private final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
 
-  /** whether it's enable mem control */
+  /** whether it's enable mem control. */
   private final boolean enableMemControl = config.isEnableMemControl();
 
-  /** database info for mem control */
+  /** database info for mem control. */
   private DataRegionInfo dataRegionInfo;
-  /** tsfile processor info for mem control */
+  /** tsfile processor info for mem control. */
   private TsFileProcessorInfo tsFileProcessorInfo;
 
-  /** sync this object in query() and asyncTryToFlush() */
+  /** sync this object in query() and asyncTryToFlush(). */
   private final ConcurrentLinkedDeque<IMemTable> flushingMemTables = new ConcurrentLinkedDeque<>();
 
-  /** modification to memtable mapping */
+  /** modification to memtable mapping. */
   private List<Pair<Modification, IMemTable>> modsToMemtable = new ArrayList<>();
 
-  /** writer for restore tsfile and flushing */
+  /** writer for restore tsfile and flushing. */
   private RestorableTsFileIOWriter writer;
 
-  /** tsfile resource for index this tsfile */
+  /** tsfile resource for index this tsfile. */
   private final TsFileResource tsFileResource;
 
   /** time range index to indicate this processor belongs to which time range */
@@ -140,35 +140,35 @@ public class TsFileProcessor {
    */
   private volatile boolean shouldClose;
 
-  /** working memtable */
+  /** working memtable. */
   private IMemTable workMemTable;
 
-  /** last flush time to flush the working memtable */
+  /** last flush time to flush the working memtable. */
   private long lastWorkMemtableFlushTime;
 
   /** this callback is called before the workMemtable is added into the flushingMemTables. */
   private final UpdateEndTimeCallBack updateLatestFlushTimeCallback;
 
-  /** wal node */
+  /** wal node. */
   private final IWALNode walNode;
 
-  /** whether it's a sequence file or not */
+  /** whether it's a sequence file or not. */
   private final boolean sequence;
 
-  /** total memtable size for mem control */
+  /** total memtable size for mem control. */
   private long totalMemTableSize;
 
   private static final String FLUSH_QUERY_WRITE_LOCKED = "{}: {} get flushQueryLock write lock";
   private static final String FLUSH_QUERY_WRITE_RELEASE =
       "{}: {} get flushQueryLock write lock released";
 
-  /** close file listener */
-  private List<CloseFileListener> closeFileListeners = new ArrayList<>();
+  /** close file listener. */
+  private final List<CloseFileListener> closeFileListeners = new ArrayList<>();
 
-  /** flush file listener */
-  private List<FlushListener> flushListeners = new ArrayList<>();
+  /** flush file listener. */
+  private final List<FlushListener> flushListeners = new ArrayList<>();
 
-  private final QueryMetricsManager QUERY_METRICS = QueryMetricsManager.getInstance();
+  private final QueryMetricsManager queryMetricsManager = QueryMetricsManager.getInstance();
 
   @SuppressWarnings("squid:S107")
   TsFileProcessor(
@@ -226,7 +226,10 @@ public class TsFileProcessor {
   public void insert(InsertRowNode insertRowNode) throws WriteProcessException {
 
     if (workMemTable == null) {
+      long startTime = System.nanoTime();
       createNewWorkingMemTable();
+      PerformanceOverviewMetricsManager.recordCreateMemtableBlockCost(
+          System.nanoTime() - startTime);
     }
 
     long[] memIncrements = null;
@@ -243,8 +246,8 @@ public class TsFileProcessor {
                 insertRowNode.getDevicePath().getFullPath(), insertRowNode.getMeasurements(),
                 insertRowNode.getDataTypes(), insertRowNode.getValues());
       }
-      PerformanceOverviewMetricsManager.getInstance()
-          .recordScheduleMemoryBlockCost(System.nanoTime() - startTime);
+      PerformanceOverviewMetricsManager.recordScheduleMemoryBlockCost(
+          System.nanoTime() - startTime);
     }
 
     long startTime = System.nanoTime();
@@ -254,7 +257,7 @@ public class TsFileProcessor {
         throw walFlushListener.getCause();
       }
     } catch (Exception e) {
-      if (enableMemControl && memIncrements != null) {
+      if (enableMemControl) {
         rollbackMemoryInfo(memIncrements);
       }
       throw new WriteProcessException(
@@ -263,8 +266,7 @@ public class TsFileProcessor {
               storageGroupName, tsFileResource.getTsFile().getAbsolutePath()),
           e);
     } finally {
-      PerformanceOverviewMetricsManager.getInstance()
-          .recordScheduleWalCost(System.nanoTime() - startTime);
+      PerformanceOverviewMetricsManager.recordScheduleWalCost(System.nanoTime() - startTime);
     }
 
     startTime = System.nanoTime();
@@ -283,8 +285,7 @@ public class TsFileProcessor {
       tsFileResource.updateEndTime(
           insertRowNode.getDeviceID().toStringID(), insertRowNode.getTime());
     }
-    PerformanceOverviewMetricsManager.getInstance()
-        .recordScheduleMemTableCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordScheduleMemTableCost(System.nanoTime() - startTime);
   }
 
   private void createNewWorkingMemTable() throws WriteProcessException {
@@ -307,7 +308,10 @@ public class TsFileProcessor {
       throws WriteProcessException {
 
     if (workMemTable == null) {
+      long startTime = System.nanoTime();
       createNewWorkingMemTable();
+      PerformanceOverviewMetricsManager.recordCreateMemtableBlockCost(
+          System.nanoTime() - startTime);
     }
 
     long[] memIncrements = null;
@@ -333,8 +337,8 @@ public class TsFileProcessor {
                   start,
                   end);
         }
-        PerformanceOverviewMetricsManager.getInstance()
-            .recordScheduleMemoryBlockCost(System.nanoTime() - startTime);
+        PerformanceOverviewMetricsManager.recordScheduleMemoryBlockCost(
+            System.nanoTime() - startTime);
       }
     } catch (WriteProcessException e) {
       for (int i = start; i < end; i++) {
@@ -354,13 +358,12 @@ public class TsFileProcessor {
       for (int i = start; i < end; i++) {
         results[i] = RpcUtils.getStatus(TSStatusCode.INTERNAL_SERVER_ERROR, e.getMessage());
       }
-      if (enableMemControl && memIncrements != null) {
+      if (enableMemControl) {
         rollbackMemoryInfo(memIncrements);
       }
       throw new WriteProcessException(e);
     } finally {
-      PerformanceOverviewMetricsManager.getInstance()
-          .recordScheduleWalCost(System.nanoTime() - startTime);
+      PerformanceOverviewMetricsManager.recordScheduleWalCost(System.nanoTime() - startTime);
     }
 
     startTime = System.nanoTime();
@@ -389,8 +392,7 @@ public class TsFileProcessor {
       tsFileResource.updateEndTime(
           insertTabletNode.getDeviceID().toStringID(), insertTabletNode.getTimes()[end - 1]);
     }
-    PerformanceOverviewMetricsManager.getInstance()
-        .recordScheduleMemTableCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordScheduleMemTableCost(System.nanoTime() - startTime);
   }
 
   @SuppressWarnings("squid:S3776") // high Cognitive Complexity
@@ -1424,8 +1426,8 @@ public class TsFileProcessor {
             tsFileResource.getTsFile().getName(),
             e);
       } finally {
-        QUERY_METRICS.recordQueryResourceNum(FLUSHING_MEMTABLE, flushingMemTables.size());
-        QUERY_METRICS.recordQueryResourceNum(WORKING_MEMTABLE, workMemTable != null ? 1 : 0);
+        queryMetricsManager.recordQueryResourceNum(FLUSHING_MEMTABLE, flushingMemTables.size());
+        queryMetricsManager.recordQueryResourceNum(WORKING_MEMTABLE, workMemTable != null ? 1 : 0);
 
         flushQueryLock.readLock().unlock();
         if (logger.isDebugEnabled()) {
@@ -1442,7 +1444,8 @@ public class TsFileProcessor {
                 pathToReadOnlyMemChunkMap, pathToChunkMetadataListMap, tsFileResource));
       }
     } finally {
-      QUERY_METRICS.recordExecutionCost(GET_QUERY_RESOURCE_FROM_MEM, System.nanoTime() - startTime);
+      queryMetricsManager.recordExecutionCost(
+          GET_QUERY_RESOURCE_FROM_MEM, System.nanoTime() - startTime);
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
index 8aae71cb30..71e870cc67 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
@@ -116,8 +116,10 @@ public class RegionWriteExecutor {
       boolean hasFailedTriggerBeforeInsertion =
           result.equals(TriggerFireResult.FAILED_NO_TERMINATION);
 
-      planNode.setMetricTime(System.nanoTime());
+      long startWriteTime = System.nanoTime();
       writeResponse = DataRegionConsensusImpl.getInstance().write(groupId, planNode);
+      PerformanceOverviewMetricsManager.recordScheduleStorageCost(
+          System.nanoTime() - startWriteTime);
 
       // fire Trigger after the insertion
       if (writeResponse.isSuccessful()) {
@@ -132,7 +134,7 @@ public class RegionWriteExecutor {
         triggerCostTime += (System.nanoTime() - startTime);
       }
     }
-    PerformanceOverviewMetricsManager.getInstance().recordScheduleTriggerCost(triggerCostTime);
+    PerformanceOverviewMetricsManager.recordScheduleTriggerCost(triggerCostTime);
     return writeResponse;
   }
 
@@ -224,8 +226,8 @@ public class RegionWriteExecutor {
           }
           return response;
         } finally {
-          PerformanceOverviewMetricsManager.getInstance()
-              .recordScheduleSchemaValidateCost(System.nanoTime() - startTime);
+          PerformanceOverviewMetricsManager.recordScheduleSchemaValidateCost(
+              System.nanoTime() - startTime);
         }
         boolean hasFailedMeasurement = insertNode.hasFailedMeasurements();
         String partialInsertMessage = null;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetricsManager.java b/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetricsManager.java
index b3a441d280..1dbab30601 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetricsManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/metric/PerformanceOverviewMetricsManager.java
@@ -21,157 +21,194 @@ package org.apache.iotdb.db.mpp.metric;
 
 import org.apache.iotdb.commons.service.metric.MetricService;
 import org.apache.iotdb.commons.service.metric.enums.Metric;
+import org.apache.iotdb.commons.service.metric.enums.PerformanceOverviewMetrics;
 import org.apache.iotdb.commons.service.metric.enums.Tag;
+import org.apache.iotdb.metrics.type.Timer;
 import org.apache.iotdb.metrics.utils.MetricLevel;
 
-import java.util.concurrent.TimeUnit;
-
 public class PerformanceOverviewMetricsManager {
-  private final MetricService metricService = MetricService.getInstance();
+  private static final MetricService metricService = MetricService.getInstance();
+
+  // region overview
+  private static final String PERFORMANCE_OVERVIEW_DETAIL =
+      Metric.PERFORMANCE_OVERVIEW_DETAIL.toString();
+  private static final Timer AUTH_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.AUTHORITY);
+  private static final Timer PARSER_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.PARSER);
+  private static final Timer ANALYZE_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.ANALYZER);
+  private static final Timer PLAN_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.PLANNER);
+  private static final Timer SCHEDULE_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.SCHEDULER);
 
   /** Record the time cost in authority stage. */
-  public void recordAuthCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.AUTHORITY);
+  public static void recordAuthCost(long costTimeInNanos) {
+    AUTH_TIMER.updateNanos(costTimeInNanos);
   }
 
   /** Record the time cost in parse stage. */
-  public void recordParseCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.PARSER);
-  }
-
-  public void recordAnalyzeCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.ANALYZER);
-  }
-
-  public void recordPlanCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.PLANNER);
-  }
-
-  public void recordScheduleCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.SCHEDULER);
-  }
-
-  public void recordScheduleSchemaValidateCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.SCHEMA_VALIDATE);
-  }
-
-  public void recordScheduleTriggerCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.TRIGGER);
-  }
-
-  public void recordScheduleConsensusCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.CONSENSUS);
-  }
-
-  public void recordScheduleLockCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.LOCK);
-  }
-
-  public void recordScheduleMemoryBlockCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.MEMORY_BLOCK);
-  }
-
-  public void recordScheduleWalCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.WAL);
-  }
-
-  public void recordScheduleMemTableCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.MEMTABLE);
-  }
-
-  public void recordScheduleUpdateLastCacheCost(long costTimeInNanos) {
-    metricService.timer(
-        costTimeInNanos,
-        TimeUnit.NANOSECONDS,
-        Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString(),
-        MetricLevel.IMPORTANT,
-        Tag.STAGE.toString(),
-        PerformanceOverviewMetrics.LAST_CACHE);
-  }
-
-  public static PerformanceOverviewMetricsManager getInstance() {
-    return PerformanceOverviewMetricsManager.PerformanceOverviewMetricsManagerHolder.INSTANCE;
-  }
-
-  private static class PerformanceOverviewMetricsManagerHolder {
-
-    private static final PerformanceOverviewMetricsManager INSTANCE =
-        new PerformanceOverviewMetricsManager();
-
-    private PerformanceOverviewMetricsManagerHolder() {
-      // empty constructor
-    }
+  public static void recordParseCost(long costTimeInNanos) {
+    PARSER_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordAnalyzeCost(long costTimeInNanos) {
+    ANALYZE_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordPlanCost(long costTimeInNanos) {
+    PLAN_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordScheduleCost(long costTimeInNanos) {
+    SCHEDULE_TIMER.updateNanos(costTimeInNanos);
+  }
+  // endregion
+
+  // region schedule
+  private static final String PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL =
+      Metric.PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL.toString();
+  private static final Timer LOCAL_SCHEDULE_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.LOCAL_SCHEDULE);
+  private static final Timer REMOTE_SCHEDULE_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_SCHEDULE_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.REMOTE_SCHEDULE);
+
+  public static void recordScheduleLocalCost(long costTimeInNanos) {
+    LOCAL_SCHEDULE_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordScheduleRemoteCost(long costTimeInNanos) {
+    REMOTE_SCHEDULE_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  // endregion
+
+  // region local schedule
+  private static final String PERFORMANCE_OVERVIEW_LOCAL_DETAIL =
+      Metric.PERFORMANCE_OVERVIEW_LOCAL_DETAIL.toString();
+  private static final Timer SCHEMA_VALIDATE_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.SCHEMA_VALIDATE);
+  private static final Timer TRIGGER_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.TRIGGER);
+  private static final Timer STORAGE_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_LOCAL_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.STORAGE);
+
+  public static void recordScheduleSchemaValidateCost(long costTimeInNanos) {
+    SCHEMA_VALIDATE_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordScheduleTriggerCost(long costTimeInNanos) {
+    TRIGGER_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordScheduleStorageCost(long costTimeInNanos) {
+    STORAGE_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  // endregion
+
+  // region engine
+  private static final String PERFORMANCE_OVERVIEW_ENGINE_DETAIL =
+      Metric.PERFORMANCE_OVERVIEW_ENGINE_DETAIL.toString();
+  private static final Timer LOCK_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.LOCK);
+  private static final Timer CREATE_MEMTABLE_BLOCK_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.CREATE_MEMTABLE_BLOCK);
+  private static final Timer MEMORY_BLOCK_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.MEMORY_BLOCK);
+  private static final Timer WAL_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.WAL);
+  private static final Timer MEMTABLE_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.MEMTABLE);
+  private static final Timer LAST_CACHE_TIMER =
+      metricService.getOrCreateTimer(
+          PERFORMANCE_OVERVIEW_ENGINE_DETAIL,
+          MetricLevel.IMPORTANT,
+          Tag.STAGE.toString(),
+          PerformanceOverviewMetrics.LAST_CACHE);
+
+  public static void recordScheduleLockCost(long costTimeInNanos) {
+    LOCK_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordCreateMemtableBlockCost(long costTimeInNanos) {
+    CREATE_MEMTABLE_BLOCK_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordScheduleMemoryBlockCost(long costTimeInNanos) {
+    MEMORY_BLOCK_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordScheduleWalCost(long costTimeInNanos) {
+    WAL_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordScheduleMemTableCost(long costTimeInNanos) {
+    MEMTABLE_TIMER.updateNanos(costTimeInNanos);
+  }
+
+  public static void recordScheduleUpdateLastCacheCost(long costTimeInNanos) {
+    LAST_CACHE_TIMER.updateNanos(costTimeInNanos);
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
index 1d0bec9209..de474a5db2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
@@ -211,7 +211,7 @@ public class QueryExecution implements IQueryExecution {
     if (context.getQueryType() == QueryType.READ) {
       initResultHandle();
     }
-    PerformanceOverviewMetricsManager.getInstance().recordPlanCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordPlanCost(System.nanoTime() - startTime);
     schedule();
   }
 
@@ -281,8 +281,7 @@ public class QueryExecution implements IQueryExecution {
     try {
       result = new Analyzer(context, partitionFetcher, schemaFetcher).analyze(statement);
     } finally {
-      PerformanceOverviewMetricsManager.getInstance()
-          .recordAnalyzeCost(System.nanoTime() - startTime);
+      PerformanceOverviewMetricsManager.recordAnalyzeCost(System.nanoTime() - startTime);
     }
     return result;
   }
@@ -310,8 +309,7 @@ public class QueryExecution implements IQueryExecution {
             syncInternalServiceClientManager,
             asyncInternalServiceClientManager);
     this.scheduler.start();
-    PerformanceOverviewMetricsManager.getInstance()
-        .recordScheduleCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordScheduleCost(System.nanoTime() - startTime);
   }
 
   // Use LogicalPlanner to do the logical query plan and logical optimization
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
index ef0e19cdca..d848a9a45e 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
@@ -146,7 +146,7 @@ public class StatementGenerator {
     queryStatement.setSelectComponent(selectComponent);
     queryStatement.setFromComponent(fromComponent);
     queryStatement.setWhereCondition(whereCondition);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return queryStatement;
   }
 
@@ -180,7 +180,7 @@ public class StatementGenerator {
     lastQueryStatement.setSelectComponent(selectComponent);
     lastQueryStatement.setFromComponent(fromComponent);
     lastQueryStatement.setWhereCondition(whereCondition);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
 
     return lastQueryStatement;
   }
@@ -236,7 +236,7 @@ public class StatementGenerator {
       whereCondition.setPredicate(predicate);
       queryStatement.setWhereCondition(whereCondition);
     }
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return queryStatement;
   }
 
@@ -250,7 +250,7 @@ public class StatementGenerator {
     insertStatement.setMeasurements(insertRecordReq.getMeasurements().toArray(new String[0]));
     insertStatement.setAligned(insertRecordReq.isAligned);
     insertStatement.fillValues(insertRecordReq.values);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return insertStatement;
   }
 
@@ -266,7 +266,7 @@ public class StatementGenerator {
     insertStatement.setValues(insertRecordReq.getValues().toArray(new Object[0]));
     insertStatement.setNeedInferType(true);
     insertStatement.setAligned(insertRecordReq.isAligned);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return insertStatement;
   }
 
@@ -295,7 +295,7 @@ public class StatementGenerator {
     }
     insertStatement.setDataTypes(dataTypes);
     insertStatement.setAligned(insertTabletReq.isAligned);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return insertStatement;
   }
 
@@ -334,7 +334,7 @@ public class StatementGenerator {
       insertTabletStatementList.add(insertTabletStatement);
     }
     insertStatement.setInsertTabletStatementList(insertTabletStatementList);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return insertStatement;
   }
 
@@ -358,7 +358,7 @@ public class StatementGenerator {
       insertRowStatementList.add(statement);
     }
     insertStatement.setInsertRowStatementList(insertRowStatementList);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return insertStatement;
   }
 
@@ -384,7 +384,7 @@ public class StatementGenerator {
       insertRowStatementList.add(statement);
     }
     insertStatement.setInsertRowStatementList(insertRowStatementList);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return insertStatement;
   }
 
@@ -409,7 +409,7 @@ public class StatementGenerator {
       insertRowStatementList.add(statement);
     }
     insertStatement.setInsertRowStatementList(insertRowStatementList);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return insertStatement;
   }
 
@@ -436,7 +436,7 @@ public class StatementGenerator {
       insertRowStatementList.add(statement);
     }
     insertStatement.setInsertRowStatementList(insertRowStatementList);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return insertStatement;
   }
 
@@ -447,7 +447,7 @@ public class StatementGenerator {
     DatabaseSchemaStatement statement =
         new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE);
     statement.setStorageGroupPath(parseStorageGroupRawString(storageGroup));
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -464,7 +464,7 @@ public class StatementGenerator {
     statement.setTags(req.tags);
     statement.setAttributes(req.attributes);
     statement.setAlias(req.measurementAlias);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -493,7 +493,7 @@ public class StatementGenerator {
     statement.setTagsList(req.tagsList);
     statement.setAttributesList(req.attributesList);
     statement.setAliasList(req.measurementAlias);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -526,7 +526,7 @@ public class StatementGenerator {
     statement.setTagsList(req.tagsList);
     statement.setAttributesList(req.attributesList);
     statement.setAliasList(req.measurementAliasList);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -538,7 +538,7 @@ public class StatementGenerator {
       parseStorageGroupRawString(path);
     }
     statement.setPrefixPath(storageGroups);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -553,7 +553,7 @@ public class StatementGenerator {
     statement.setPathList(pathList);
     statement.setDeleteStartTime(req.getStartTime());
     statement.setDeleteEndTime(req.getEndTime());
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -644,7 +644,7 @@ public class StatementGenerator {
     CreateSchemaTemplateStatement statement =
         new CreateSchemaTemplateStatement(
             req.getName(), measurements, dataTypes, encodings, compressors, alignedPrefix.keySet());
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -669,7 +669,7 @@ public class StatementGenerator {
       default:
         break;
     }
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return result;
   }
 
@@ -678,7 +678,7 @@ public class StatementGenerator {
     long startTime = System.nanoTime();
     SetSchemaTemplateStatement statement =
         new SetSchemaTemplateStatement(req.getTemplateName(), new PartialPath(req.getPrefixPath()));
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -688,14 +688,14 @@ public class StatementGenerator {
     UnsetSchemaTemplateStatement statement =
         new UnsetSchemaTemplateStatement(
             req.getTemplateName(), new PartialPath(req.getPrefixPath()));
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
   public static DropSchemaTemplateStatement createStatement(TSDropSchemaTemplateReq req) {
     final long startTime = System.nanoTime();
     DropSchemaTemplateStatement statement = new DropSchemaTemplateStatement(req.getTemplateName());
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -707,7 +707,7 @@ public class StatementGenerator {
       pathPatternList.add(new PartialPath(pathPatternString));
     }
     DeleteTimeSeriesStatement statement = new DeleteTimeSeriesStatement(pathPatternList);
-    PerformanceOverviewMetricsManager.getInstance().recordParseCost(System.nanoTime() - startTime);
+    PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     return statement;
   }
 
@@ -757,8 +757,7 @@ public class StatementGenerator {
       }
       return astVisitor.visit(tree);
     } finally {
-      PerformanceOverviewMetricsManager.getInstance()
-          .recordParseCost(System.nanoTime() - startTime);
+      PerformanceOverviewMetricsManager.recordParseCost(System.nanoTime() - startTime);
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNode.java
index 0e85bd9461..280ebe48e9 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNode.java
@@ -45,8 +45,6 @@ public abstract class PlanNode implements IConsensusRequest {
 
   private PlanNodeId id;
 
-  private volatile long metricTime = 0L;
-
   protected PlanNode(PlanNodeId id) {
     requireNonNull(id, "id is null");
     this.id = id;
@@ -64,14 +62,6 @@ public abstract class PlanNode implements IConsensusRequest {
 
   public abstract void addChild(PlanNode child);
 
-  public long getMetricTime() {
-    return metricTime;
-  }
-
-  public void setMetricTime(long metricTime) {
-    this.metricTime = metricTime;
-  }
-
   @Override
   public abstract PlanNode clone();
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncPlanNodeSender.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncPlanNodeSender.java
index 957f638ed1..f19de2323f 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncPlanNodeSender.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncPlanNodeSender.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.mpp.plan.scheduler;
 
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
@@ -34,8 +35,8 @@ import org.slf4j.LoggerFactory;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicLong;
 
 import static com.google.common.util.concurrent.Futures.immediateFuture;
 
@@ -44,8 +45,8 @@ public class AsyncPlanNodeSender {
   private final IClientManager<TEndPoint, AsyncDataNodeInternalServiceClient>
       asyncInternalServiceClientManager;
   private final List<FragmentInstance> instances;
-  private final CountDownLatch countDownLatch;
   private final Map<Integer, TSendPlanNodeResp> instanceId2RespMap;
+  private final AtomicLong pendingNumber;
 
   public AsyncPlanNodeSender(
       IClientManager<TEndPoint, AsyncDataNodeInternalServiceClient>
@@ -53,15 +54,16 @@ public class AsyncPlanNodeSender {
       List<FragmentInstance> instances) {
     this.asyncInternalServiceClientManager = asyncInternalServiceClientManager;
     this.instances = instances;
-    this.countDownLatch = new CountDownLatch(instances.size());
     this.instanceId2RespMap = new ConcurrentHashMap<>();
+    this.pendingNumber = new AtomicLong(instances.size());
   }
 
   public void sendAll() {
+    long startSendTime = System.nanoTime();
     for (int i = 0; i < instances.size(); ++i) {
       FragmentInstance instance = instances.get(i);
       AsyncSendPlanNodeHandler handler =
-          new AsyncSendPlanNodeHandler(i, countDownLatch, instanceId2RespMap);
+          new AsyncSendPlanNodeHandler(i, pendingNumber, instanceId2RespMap, startSendTime);
       try {
         TSendPlanNodeReq sendPlanNodeReq =
             new TSendPlanNodeReq(
@@ -78,7 +80,11 @@ public class AsyncPlanNodeSender {
   }
 
   public void waitUntilCompleted() throws InterruptedException {
-    countDownLatch.await();
+    synchronized (pendingNumber) {
+      while (pendingNumber.get() != 0) {
+        pendingNumber.wait();
+      }
+    }
   }
 
   public Future<FragInstanceDispatchResult> getResult() {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncSendPlanNodeHandler.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncSendPlanNodeHandler.java
index 9b8f88b9ae..d0cb0e9679 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncSendPlanNodeHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/AsyncSendPlanNodeHandler.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.mpp.plan.scheduler;
 
+import org.apache.iotdb.db.mpp.metric.PerformanceOverviewMetricsManager;
 import org.apache.iotdb.mpp.rpc.thrift.TSendPlanNodeResp;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
@@ -25,26 +26,34 @@ import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.thrift.async.AsyncMethodCallback;
 
 import java.util.Map;
-import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicLong;
 
 public class AsyncSendPlanNodeHandler implements AsyncMethodCallback<TSendPlanNodeResp> {
   private final int instanceId;
-  private final CountDownLatch countDownLatch;
+  private final AtomicLong pendingNumber;
   private final Map<Integer, TSendPlanNodeResp> instanceId2RespMap;
+  private final long sendTime;
 
   public AsyncSendPlanNodeHandler(
       int instanceId,
-      CountDownLatch countDownLatch,
-      Map<Integer, TSendPlanNodeResp> instanceId2RespMap) {
+      AtomicLong pendingNumber,
+      Map<Integer, TSendPlanNodeResp> instanceId2RespMap,
+      long sendTime) {
     this.instanceId = instanceId;
-    this.countDownLatch = countDownLatch;
+    this.pendingNumber = pendingNumber;
     this.instanceId2RespMap = instanceId2RespMap;
+    this.sendTime = sendTime;
   }
 
   @Override
   public void onComplete(TSendPlanNodeResp tSendPlanNodeResp) {
     instanceId2RespMap.put(instanceId, tSendPlanNodeResp);
-    countDownLatch.countDown();
+    if (pendingNumber.decrementAndGet() == 0) {
+      PerformanceOverviewMetricsManager.recordScheduleRemoteCost(System.nanoTime() - sendTime);
+      synchronized (pendingNumber) {
+        pendingNumber.notifyAll();
+      }
+    }
   }
 
   @Override
@@ -56,6 +65,11 @@ public class AsyncSendPlanNodeHandler implements AsyncMethodCallback<TSendPlanNo
     resp.setStatus(
         RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode(), errorMsg));
     instanceId2RespMap.put(instanceId, resp);
-    countDownLatch.countDown();
+    if (pendingNumber.decrementAndGet() == 0) {
+      PerformanceOverviewMetricsManager.recordScheduleRemoteCost(System.nanoTime() - sendTime);
+      synchronized (pendingNumber) {
+        pendingNumber.notifyAll();
+      }
+    }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/FragmentInstanceDispatcherImpl.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/FragmentInstanceDispatcherImpl.java
index 0425b4fc72..3226884b56 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/FragmentInstanceDispatcherImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/FragmentInstanceDispatcherImpl.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.db.mpp.common.MPPQueryContext;
 import org.apache.iotdb.db.mpp.execution.executor.RegionExecutionResult;
 import org.apache.iotdb.db.mpp.execution.executor.RegionReadExecutor;
 import org.apache.iotdb.db.mpp.execution.executor.RegionWriteExecutor;
+import org.apache.iotdb.db.mpp.metric.PerformanceOverviewMetricsManager;
 import org.apache.iotdb.db.mpp.metric.QueryMetricsManager;
 import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
 import org.apache.iotdb.db.mpp.plan.planner.plan.FragmentInstance;
@@ -177,6 +178,7 @@ public class FragmentInstanceDispatcherImpl implements IFragInstanceDispatcher {
         new AsyncPlanNodeSender(asyncInternalServiceClientManager, remoteInstances);
     asyncPlanNodeSender.sendAll();
     // sync dispatch to local
+    long localScheduleStartTime = System.nanoTime();
     for (FragmentInstance localInstance : localInstances) {
       try (SetThreadName threadName = new SetThreadName(localInstance.getId().getFullId())) {
         dispatchOneInstance(localInstance);
@@ -190,6 +192,8 @@ public class FragmentInstanceDispatcherImpl implements IFragInstanceDispatcher {
                     TSStatusCode.INTERNAL_SERVER_ERROR, "Unexpected errors: " + t.getMessage())));
       }
     }
+    PerformanceOverviewMetricsManager.recordScheduleLocalCost(
+        System.nanoTime() - localScheduleStartTime);
     // wait until remote dispatch done
     try {
       asyncPlanNodeSender.waitUntilCompleted();