TiDB 4.0 诊断系统添加了集群监控系统表,所有表都在 中,可以通过 SQL 的方式查询。通过 SQL 查询监控的好处在于可以对整个集群的所有监控进行关联查询,并对比不同时间段的结果,迅速找出性能瓶颈。
tidb_query_duration
表用来查询 TiDB query 执行的百分位时间,如 P999,P99,P90 的查询耗时,单位是秒。 其表结构如下:
下面 SQL 查询当前时间的 P90 的 TiDB Query 耗时。可以看出,Select
类似的 Query 的 P90 耗时是 0.0384 秒,internal
类型的 P90 耗时是 0.00327。instance
字段是 TiDB 示例的地址。
由于目前监控表非常多,本小节不会完全列举所有监控表。系统表 存储所有监控系统表的元数据信息,所有的监控表可以通过 SQL select * from information_schema.metrics_tables
查询。
字段名 | 类型 | 字段解释 |
---|---|---|
TABLE_NAME | varchar(64) | 对应于 metrics_schema 中的表名 |
PROMQL | varchar(64) | 监控表的主要原理是将 SQL 映射成 PromQL,并将 prometheus 结果转换成 SQL 查询结果,这个字段是 PromQL 的表达式模板,获取监控表数据时使用查询条件改写模板中的变量,生成最终的查询表达式 |
LABELS | varchar(64) | 监控定义的 label,每一个 label 会对应监控表中的一列,SQL 中如果包含对应列的过滤,对应的 PromQL 也会改变 |
QUANTILE | double unsigned | 百分位,对于直方图的监控数据,指定一个默认百分位,如果值为 0,表示该监控表对应的监控不是直方图 |
COMMENT | varchar(256) | 对该监控表的解释 |
上一小节描述的表结构中有一列 PROMQL
,TiDB 会根据 SQL 生成一条 PromQL
的查询,然后把查询请求发给 prometheus 查询相应的监控信息。
通过以下 SQL 的执行计划,可以发现在 MemTableScan
中,有一个 PromQL
,其中 start_time
和 end_time
分别表示查询监控的时间范围的起止,step
表示查询的分辨率步长,默认值是 1 分钟。这几个参数和 的参数是一样的。
如果 SQL 的 中没有 time 条件,默认会查询最近 10 分钟的监控数据。
和监控表查询相关的 2 个 session 变量,可以通过修改 session 的变量来调整监控查询的默认行为。相关参数如下:
tidb_metric_query_step
:查询的分辨率步长。从 prometheus 的 query_range 数据时需要指定 start,end,step,其中 step 会使用该变量的值tidb_metric_query_range_duration
:生成 PromQL 语句时,会将 PromQL 中的 $RANGE_DURATION 替换成该变量的值,默认值是 60 秒
例如,将步长调整为 60
目前 TiDB 会从 PD 中查询 prometheus
的地址,然后将查询请求发给 prometheus
,后续 PD 会考虑内置监控组件,就不用再部署 prometheus
组件了。下面例子按照 instance
和 sql_type
聚合后,查询 ['2020-03-08 13:23:00', '2020-03-08 13:33:00')
范围内的 P99 耗时的 avg, max, min 值。