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_timeend_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 组件了。下面例子按照 instancesql_type 聚合后,查询 ['2020-03-08 13:23:00', '2020-03-08 13:33:00') 范围内的 P99 耗时的 avg, max, min 值。