METRICS_SUMMARY
The TiDB cluster has many monitoring metrics. To make it easy to detect abnormal monitoring metrics, TiDB 4.0 introduces the following two monitoring summary tables:
information_schema.metrics_summary
information_schema.metrics_summary_by_label
The two tables summarize all monitoring data for you to check each monitoring metric efficiently. Compared with information_schema.metrics_summary
, the information_schema.metrics_summary_by_label
table has an additional label
column and performs differentiated statistics according to different labels.
USE information_schema;
DESC metrics_summary;
+--------------+--------------+------+------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+------+---------+-------+
| METRICS_NAME | varchar(64) | YES | | NULL | |
| QUANTILE | double | YES | | NULL | |
| SUM_VALUE | double(22,6) | YES | | NULL | |
| AVG_VALUE | double(22,6) | YES | | NULL | |
| MIN_VALUE | double(22,6) | YES | | NULL | |
| MAX_VALUE | double(22,6) | YES | | NULL | |
| COMMENT | varchar(256) | YES | | NULL | |
+--------------+--------------+------+------+---------+-------+
7 rows in set (0.00 sec)
Field description:
METRICS_NAME
: The monitoring table name.QUANTILE
: The percentile. You can specifyQUANTILE
using SQL statements. For example:select * from metrics_summary where quantile=0.99
specifies viewing the data of the 0.99 percentile.select * from metrics_summary where quantile in (0.80, 0.90, 0.99, 0.999)
specifies viewing the data of the 0.8, 0.90, 0.99, 0.999 percentiles at the same time.
SUM_VALUE
,AVG_VALUE
,MIN_VALUE
, andMAX_VALUE
respectively mean the sum, the average value, the minimum value, and the maximum value.COMMENT
: The comment for the corresponding monitoring table.
For example:
To query the three groups of monitoring items with the highest average time consumption in the TiDB cluster within the time range of '2020-03-08 13:23:00', '2020-03-08 13: 33: 00'
, you can directly query the information_schema.metrics_summary
table and use the /*+ time_range() */
hint to specify the time range. The SQL statement is as follows:
SELECT /*+ time_range('2020-03-08 13:23:00','2020-03-08 13:33:00') */ *
FROM information_schema.metrics_summary
WHERE metrics_name LIKE 'tidb%duration'
AND avg_value > 0
AND quantile = 0.99
ORDER BY avg_value DESC
LIMIT 3\G
***************************[ 1. row ]***************************
METRICS_NAME | tidb_get_token_duration
QUANTILE | 0.99
SUM_VALUE | 8.972509
AVG_VALUE | 0.996945
MIN_VALUE | 0.996515
MAX_VALUE | 0.997458
COMMENT | The quantile of Duration (us) for getting token, it should be small until concurrency limit is reached(second)
***************************[ 2. row ]***************************
METRICS_NAME | tidb_query_duration
QUANTILE | 0.99
SUM_VALUE | 0.269079
AVG_VALUE | 0.007272
MIN_VALUE | 0.000667
MAX_VALUE | 0.01554
COMMENT | The quantile of TiDB query durations(second)
***************************[ 3. row ]***************************
METRICS_NAME | tidb_kv_request_duration
QUANTILE | 0.99
SUM_VALUE | 0.170232
AVG_VALUE | 0.004601
MIN_VALUE | 0.000975
MAX_VALUE | 0.013
COMMENT | The quantile of kv requests durations by store
Similarly, the following example queries the metrics_summary_by_label
monitoring summary table:
SELECT /*+ time_range('2020-03-08 13:23:00','2020-03-08 13:33:00') */ *
FROM information_schema.metrics_summary_by_label
WHERE metrics_name LIKE 'tidb%duration'
AND avg_value > 0
AND quantile = 0.99
ORDER BY avg_value DESC
LIMIT 10\G
***************************[ 1. row ]***************************
INSTANCE | 172.16.5.40:10089
METRICS_NAME | tidb_get_token_duration
LABEL |
QUANTILE | 0.99
SUM_VALUE | 8.972509
AVG_VALUE | 0.996945
MIN_VALUE | 0.996515
MAX_VALUE | 0.997458
COMMENT | The quantile of Duration (us) for getting token, it should be small until concurrency limit is reached(second)
***************************[ 2. row ]***************************
INSTANCE | 172.16.5.40:10089
METRICS_NAME | tidb_query_duration
LABEL | Select
QUANTILE | 0.99
SUM_VALUE | 0.072083
AVG_VALUE | 0.008009
MIN_VALUE | 0.007905
MAX_VALUE | 0.008241
COMMENT | The quantile of TiDB query durations(second)
***************************[ 3. row ]***************************
INSTANCE | 172.16.5.40:10089
METRICS_NAME | tidb_query_duration
LABEL | Rollback
QUANTILE | 0.99
SUM_VALUE | 0.072083
AVG_VALUE | 0.008009
MIN_VALUE | 0.007905
MAX_VALUE | 0.008241
COMMENT | The quantile of TiDB query durations(second)
The second and third rows of the query results above indicate that the Select
and Rollback
statements on tidb_query_duration
have a long average execution time.
In addition to the example above, you can use the monitoring summary table to quickly find the module with the largest change from the monitoring data by comparing the full link monitoring items of the two time periods, and quickly locate the bottleneck. The following example compares all monitoring items in two periods (where t1 is the baseline) and sorts these items according to the greatest difference:
- Period t1:
("2020-03-03 17:08:00", "2020-03-03 17:11:00")
- Period t2:
("2020-03-03 17:18:00", "2020-03-03 17:21:00")
The monitoring items of the two time periods are joined according to METRICS_NAME
and sorted according to the difference value. TIME_RANGE
is the hint that specifies the query time.
SELECT GREATEST(t1.avg_value,t2.avg_value)/LEAST(t1.avg_value,
t2.avg_value) AS ratio,
t1.metrics_name,
t1.avg_value as t1_avg_value,
t2.avg_value as t2_avg_value,
t2.comment
FROM
(SELECT /*+ time_range("2020-03-03 17:08:00", "2020-03-03 17:11:00")*/ *
FROM information_schema.metrics_summary ) t1
JOIN
(SELECT /*+ time_range("2020-03-03 17:18:00", "2020-03-03 17:21:00")*/ *
FROM information_schema.metrics_summary ) t2
ON t1.metrics_name = t2.metrics_name
ORDER BY ratio DESC LIMIT 10;
+----------------+------------------------------------------+----------------+------------------+---------------------------------------------------------------------------------------------+
| ratio | metrics_name | t1_avg_value | t2_avg_value | comment |
+----------------+------------------------------------------+----------------+------------------+---------------------------------------------------------------------------------------------+
| 5865.59537065 | tidb_slow_query_cop_process_total_time | 0.016333 | 95.804724 | The total time of TiDB slow query statistics with slow query total cop process time(second) |
| 3648.74109023 | tidb_distsql_partial_scan_key_total_num | 10865.666667 | 39646004.4394 | The total num of distsql partial scan key numbers |
| 267.002351165 | tidb_slow_query_cop_wait_total_time | 0.003333 | 0.890008 | The total time of TiDB slow query statistics with slow query total cop wait time(second) |
| 192.43267836 | tikv_cop_total_response_total_size | 2515333.66667 | 484032394.445 | |
| 192.43267836 | tikv_cop_total_response_size_per_seconds | 41922.227778 | 8067206.57408 | |
| 152.780296296 | tidb_distsql_scan_key_total_num | 5304.333333 | 810397.618317 | The total num of distsql scan numbers |
| 126.042290167 | tidb_distsql_execution_total_time | 0.421622 | 53.142143 | The total time of distsql execution(second) |
| 105.164020657 | tikv_cop_scan_details | 134.450733 | 14139.379665 | |
| 105.164020657 | tikv_cop_scan_details_total | 8067.043981 | 848362.77991 | |
| 101.635495394 | tikv_cop_scan_keys_num | 1070.875 | 108838.91113 | |
+----------------+------------------------------------------+----------------+------------------+---------------------------------------------------------------------------------------------+
From the query result above, you can get the following information:
tib_slow_query_cop_process_total_time
(the time consumption ofcop process
in TiDB slow queries) in the period t2 is 5,865 times higher than that in period t1.tidb_distsql_partial_scan_key_total_num
(the number of keys to scan requested by TiDB’sdistsql
) in period t2 is 3,648 times higher than that in period t1. During period t2,tidb_slow_query_cop_wait_total_time
(the waiting time of Coprocessor requesting to queue up in the TiDB slow query) is 267 times higher than that in period t1.tikv_cop_total_response_size
(the size of the TiKV Coprocessor request result) in period t2 is 192 times higher than that in period t1.tikv_cop_scan_details
in period t2 (the scan requested by the TiKV Coprocessor) is 105 times higher than that in period t1.
From the result above, you can see that the Coprocessor requests in period t2 are much more than those in period t1. This causes TiKV Coprocessor to be overloaded, and the cop task
has to wait. It might be that some large queries appear in period t2 that bring more load.
In fact, during the entire time period from t1 to t2, the go-ycsb
pressure test is running. Then 20 tpch
queries are running during period t2. So it is the tpch
queries that cause many Coprocessor requests.