GaussDB(DWS)监控工具指南(一)作业级监控TopSQL

举报
幕后小黑爪 发表于 2023/04/04 10:09:40 2023/04/04
【摘要】  监控系统是智能化管理和自动化运维的基石,可以为资源规划,故障排查,性能优化提供至关重要的数据支持。GaussDB(DWS)作为企业级数仓,为用户提供了一整套覆盖实例级、用户级、作业级的资源监控能力,其中,作业级监控(下文统称为TopSQL)主要是对运行作业的监控,包括了实时运行作业的相关信息,历史运行作业的相关信息等。它收集的数据来源于数据库内部,为用户提供了实时监控...

目录:

1. 引言

2. TopSQL功能介绍 - 视图相关GUC说明

3. 原理解析

3.1 原理

3.2 性能分析

3.3 视图相关指标

3.4 特殊情况说明

3.5 TopSQL漏记问题

4. TopSQL扩展及应用

5. TopSQL实践:使用TopSQL定位性能问题

6. 参考


1、引言:

       监控系统是智能化管理和自动化运维的基石,可以为资源规划,故障排查,性能优化提供至关重要的数据支持。GaussDB(DWS)作为企业级数仓,为用户提供了一整套覆盖实例级、用户级、作业级的资源监控能力,其中,作业级监控(下文统称为TopSQL)主要是对运行作业的监控,包括了实时运行作业的相关信息,历史运行作业的相关信息等。它收集的数据来源于数据库内部,为用户提供了实时监控数据库的能力。

       目前TopSQL功能被用户广泛使用,是性能定位、劣化分析、审计回溯等重要的基石,为用户提供覆盖内存、耗时、IO、网络、空间等多方面的监控能力。

       本文以数仓813版本作为基线,对TopSQL进行介绍。

2、TopSQL功能介绍

     对于用户而言,数据库是个黑盒,输入SQL语句,输出预期结果。在此过程中,用户关心两点:

  • 输出结果是否符合预期;
  • 语句要多久跑完。

     关于第一个问题,用户需要关注下SQL语句写的是否合理。而对于第二个问题,普通用户可以通过explain等手段分析作业的执行计划,然而企业用户的SQL作业耗时久,影响较大,重跑代价较高,无法额外通过explain performance等手段进行分析,此时TopSQL可以帮助用户打开数据库黑盒,查看作业执行的实时情况和历史情况,便于用户分析数据库的情况。

       TopSQL功能主要通过视图进行承载,如下表所示,本文以query级别的视图为例进行说明。

级别

类型

查询数据范围

视图名称

query/perf级别

实时

CN

GS_WLM_SESSION_STATISTICS

所有CN

PGXC_WLM_SESSION_STATISTICS

历史

CN

GS_WLM_SESSION_ INFO

所有CN

PGXC_WLM_SESSION_ INFO

使用TopSQL功能需要sysadmin权限。此外,用户需先检查下TopSQL功能是否开启,涉及TopSQL的数据库GUC参数包括:

  • ENABLE_RESOURCE_TRACK (ON)

         是否开启监控功能,实时TopSQL的总开关,关闭之后实时TopSQL将不再进行记录,更不会在历史TopSQL中出现。

  • RESOURCE_TRACK_COST(0)

         设置对当前会话的语句进行资源监控的最小执行代价。

  • RESOURCE_TRACK_LEVEL(QUERY)

         设置当前会话的资源监控的等级,默认为query级别。

  • RESOURCE_TRACK_DURATION(60S)

         设置实时TopSQL中记录的语句执行结束后进行历史信息转存的最小执行时间,该时间记录值的判断是包含了排队时间和运行时间,当排队时间+运行时间 > RESOURCE_TRACK_DURATION时,TopSQL历史视图会记录作业信息。当执行完成的作业,其执行时间不小于此参数值时,作业信息会从实时视图(以STATISTICS为后缀的视图)转存到相应的历史视图

  • ENABLE_RESOURCE_RECORD(ON)

         设置是否开启资源监控记录归档功能。开启时,对于执行结束的记录,会分别被归档到相应的INFO视图,CNDN都需要设置上。

  • TOPSQL_RETENTION_TIME(30)

         设置历史TopSQLGS_WLM_SESSION_INFOGS_WLM_OPERATOR_INFO表中数据的保存时间,单位为天。

         参数正确设置后,TopSQL会记录用户的SQL语句执行过程中的相关信息,用户可以使用TopSQL的视图筛选出执行时间较长的作业,专注于SQL的分析。

    TopSQL功能分为实时TopSQL和历史TopSQL,以query级别为例,当需要查看正在运行的作业时,用户可查看实时TopSQL视图GS_WLM_SESSION_STATISTICSPGXC_WLM_SESSION_STATISTICS,若需要对已经执行完成的作业进行分析,可查询历史TopSQL视图GS_WLM_SESSION_ HISTORYPGXC_WLM_SESSION_ HISTORY。其中GS_开头的可以查询当前CN节点上正在执行的作业信息,PGXC_开头的可查询所有CN节点上正在执行的作业信息。

       实时TopSQL视图为用户记录了作业运行时的相关信息,比如作业下发来源、阻塞时间、执行时长、开始时间、内存消耗、作业下盘量、作业IO、网络、语句类型、语句的执行计划等信息。用户可先通过resource_poolnodenameusernamequery等信息定位到自己需要分析的语句,再通过作业运行信息定位问题。又或者用户可通过对查询进行筛选,筛选出当前占用资源较多的作业。

       历史TopSQL视图记录了作业运行结束时的资源使用情况(包括内存、下盘、CPU时间等)和运行状态信息(包括报错、终止、异常等)以及性能告警信息。用户可通过对历史语句运行数据的分析,筛选出执行时长较大的语句,看语句执行计划是否有优化的空间,是否需要对表做一些analyze或者vacuum之类的操作。又比如对于内存报错的情况,可分析内存占用高的语句是否合理,从执行计划上分析是否有优化空间。

        文末附TopSQL实践:常见问题现象及对应原因。

3、TopSQL的原理解析

3.1 TopSQL原理简介:

        TopSQL的数据来源于数据库内核,当语句执行时,TopSQL会实时记录语句执行的相关信息。实时TopSQL数据会保存在内存的临时表中,当语句执行结束后,数据会转存到对应实体表GS_WLM_SESSION_INFO中,在实际使用中,由于下发作业繁多,历史TopSQL记录的作业数也不断增长,这样会导致INFO表中的数据量逐渐庞大,为了确保数仓整体性能不受影响,支持通过TOPSQL_RETENTION_TIME来设置INFO表中数据的保存时间(单位为天)。当数据存留时长超过这个时限,会对实体表GS_WLM_SESSION_INFO进行数据老化删除处理。

topsql.png

3-1 TopSQL数据流通图

      如图3-1所示,各项GUC参数决定了TopSQL生成的记录信息,具体的参数说明详见第2节使用TopSQL前的检验。

3.2 性能分析:

      对于企业用户而言,性能问题是Top级问题,对于TopSQL功能,我们进行了性能压测,在4TB的场景下,进行TPCC基准性能测试,进行了2000的并发压测,TPMC下降了约有2%,属于可接受的范围。

3.3 相关指标

语句属性列说明:

类型

描述

username

下发作业的用户

query_band

用于标示作业类型,可通过GUC参数query_band进行设置,默认为空字符串,可通过该函数标识作业

queryid

语句执行时标识语句的ID

query

正在执行的语句

resource_pool

用户使用的资源池

enqueue

作业负载管理状态

control_group

作业所使用的cgroup

query_plan

作业的执行计划

warning

作业的告警信息及SQL自诊断调优相关告警

stmt_type

作业的类型,如INERT、UPDATE、DELETE等

语句的执行信息属性列,斜体代表可更换前缀/后缀式的指标,类似前缀后缀有(min_,max_,total_,average_,_skew_percent)

指标

具体列名

描述

语句执行时间

block_time/start_time

作业阻塞时长/作业开始运行时间

estimate_total_time/duration

作业执行预估总时间/作业已经执行的时间(不包含作业排队的时间)

DN执行时长

max_dn_time

作业在所有DN上的执行时间(最小、最大、平均、倾斜率)

max_cpu_time

作业在所有DN上的运行占用CPU的时间(最小、最大、总和、倾斜率)

作业占用内存

estimate_memory

作业执行预估内存

max_peak_memory

作业在所有DN上占用内存值峰值指标(最小、最大、平均、倾斜率)

下盘量

spill_info

作业在DN上的下盘信息.[a:b]:数量为bDN中有aDN下盘

max_spill_size

作业在所有DN上的下盘数据量(最小、最大、平均、倾斜率)

读写IO

max_peak_iops

作业在所有DN上的每秒IO峰值(最小、最大、平均、倾斜率)

max_read_speed/max_write_speed

作业在所有DN上的IO读速率/写速率(最小、最大、平均)

网络通信

recv_pkg/send_pkg/recv_bytes/send_bytes

各个DN上的网络收发包数量,收发数据量

3.4 特殊情况说明:

      TopSQL由于自身限制,存在一些记录异常的情况,此处对8.1.3版本的TopSQL语句记录情况进行说明:

  1. 不记录特殊数据定义语句,如:SETRESETSHOWALTER SESSION SETSET  CONSTRAINTS语句;
  2. 记录数据定义语句,例如:执行CREATEALTERDROPGRANTREVOKEVACUUM语句;
  3. 记录数据操作语句,例如:
    1.     执行SELECTINSERTUPDATEDELETE语句。
    2.     执行explain analyzeexplain performance场景。
    3.     执行查询query级别/perf级别视图
  4. ODBC下发作业,由于多语句原因,会记录事务的BEGINend语句;
  5. JDBC下发作业,随机性多记录一条JDBC的内部语句
  6. 解析错误和语法报错的异常不记录
  7. 用户手动CANCEL作业,显示的监控数据可能为0
  8. 当子语句开关打开后,只会记录下发到DN上执行的子语句;
  9. 游标语句,当游标并非从缓存中读取数据,而确实触发语句下发到DN上执行的条件下,该游标语句会被记录,并且会进行语句、执行计划增强,但当游标从缓存中读取数据时,不进行记录;当游标语句在匿名块或者函数中使用时,当游标从DN上读取较多数据但不完全使用时,无法记录该游标在DN上的监控信息。
  10. JDBC执行的带占位符语句,通常会补齐参数内容,但如果参数和原语句合起来长度超过64KB,则不记录参数,或者如果是轻量化语句,直接下发到DN上执行,不记录参数.

3.5 TopSQL漏记问题

TopSQL在813版本中有一些语句不会被记录,大体分为几种情况,特此说明:

1. 用户提交的dbms_job.submit提交后定时运行的作业,TopSQL不会记录。

2. 当系统开启GTM-Free模式时,即查询该GUC参数,结果为true时。如果下发作业的用户所属的资源池快车车道并发不进行管控,则topsql信息不记录。

show enable_gtm_free

比如查询:

select * from pg_resource_pool;

从上图可以看到default_pool资源池的active_statements和max_dop都为-1,都不进行管控,此时通过该资源池绑定的用户下发作业,TopSQL不记录作业信息。


4、TopSQL扩展及应用

       TopSQL功能是GaussDB(DWS)支持性能问题定位、语句劣化分析、审计回溯等重要功能的基石。在此基础上,内核也拓展出了异常规则等一些高阶用法,在日常使用中,用户也对TopSQL提出了更高的要求,比如记录子语句、记录语句类型、提升算子级别语句监控准确性等诸多建议。为此,GaussDBDWS)团队会在此基础上继续演进,更好的服务用户,提升用户满意度。

5、TopSQL实践:常见问题定位

字段名称

字段描述

分析出可能的现象

block_time

语句执行前的阻塞时间,包含:语句解析、语句优化时间,以及作业排队时间。

A1: block_time较大,而duration值并无明显变化,说明用户作业受其它作业影响,在真正开始执行前进行了较长时间的排队,下一步需要接着查看当前数据表,统计起始时间小于start_time、结束时间大于finish_time的作业数量。

A2: block_time较小,而duration值较大,说明用户作业执行时间增加较大原因是自己导致,需要继续分析数据量的变化情况、各DN的执行时间变化。

start_time

语句开始执行时间。

finish_time

语句执行结束时间。

duration

语句执行时长。

status

语句执行的结束状态,正常为finished,异常为aborted

可以查看作业是否正常结束,如果异常,还会有异常原因。

abort_info

语句执行结束状态为aborted时显示异常信息。

min_peak_memory

语句在所有DN上的最小内存峰值,单位MB

B1: 对于同一个查询,可对比前后几次的内存消耗情况,内存消耗平均值能够反映出数据表的数据量是否有变化,memory_skew_percent值能够侧面反映出相关数据表在各DN上的数据分布是否有倾斜。并且,query_plan能够直接显示作业的执行计划,对比执行计划是否有变化。

max_peak_memory

语句在所有DN上的最大内存峰值,单位MB

average_peak_memory

语句执行过程中的内存使用平均值,单位MB

memory_skew_percent

语句各DN间的内存使用倾斜率。

min_spill_size

若发生下盘,所有DN上下盘的最小数据量,单位MB

C1: 对有大量下盘的查询有显著帮助信息,当下盘量剧增的时候,通常是表数据量有大幅增加,或者是执行计划有问题导致的,结合query_plan能进一步分析,spill_skew_percent可以查看作业是否有严重数据倾斜。

max_spill_size

若发生下盘,所有DN上下盘的最大数据量,单位MB

average_spill_siz

若发生下盘,所有DN上下盘的平均数据量,单位MB

spill_skew_percent

若发生下盘,DN间下盘倾斜率。

min_dn_time

语句在所有DN上的最小执行时间,单位ms

D1: DN上的执行时间,结合duration数据,如果一个查询的DN执行时间有严重倾斜,那就需要考虑数据表的分区、分布列是否设置合适;不合理的分区、分布列,可能会导致本应分散到多个DN的执行任务被集中到个别DN上执行,执行时间必然大大增加。

max_dn_time

语句在所有DN上的最大执行时间,单位ms

average_dn_time

语句在所有DN上的平均执行时间,单位ms

dntime_skew_percent

语句在各DN间的执行时间倾斜率。

min_cpu_time

语句在所有DN上的最小CPU时间,单位ms

E1: CPU执行时间是分配给改作业的实际执行时间,当duration有明显增加,而平均CPU执行时间无明显变化时,很可能的一个原因是作业执行期间,有多个其它计算密集型作业同时段执行,因CPU抢占的原因,拉长了该作业的执行时长。

max_cpu_time

语句在所有DN上的最大CPU时间,单位ms

total_cpu_time

语句在所有DN上的CPU总时间,单位ms

cpu_skew_percent

语句在DN间的CPU时间倾斜率。

min_peak_iops

语句在所有DN上的每秒最小IO峰值。

F1: IO是变化最莫测的一个资源,一个作业在数据量不变、内存消耗无变化、CPU执行时间无变化、下盘量无变化的情况下,偏偏duration增加了,那最可能的原因是IO的原因。IO有点独特的是,往往IOPS变小反而反应了作业受其它作业影响,IO跑步起来,拖长了作业执行时间;其它属性通常相反,如:内存、CPU、下盘量,这些值变小通常意味着作业执行变快了。

max_peak_iops

语句在所有DN上的每秒最大IO峰值。

average_peak_iops

语句在所有DN上的每秒平均IO峰值。

iops_skew_percent

语句在DN间的IO倾斜率。

query_plan

语句的执行计划。

G1: 作业执行计划是否有变化。

enqueue

语句的排队状态

H1:作业是否异常排队/排队时间过久。可能出现的几种情况有:

1.    Memory

2.    Waiting in queue

3.    Waiting in global queue

4.    Waiting in respool queue

5.    Waiting in ccn queue

6.    No waiting queue

7.    Null

warning

语句的告警信息及SQL自诊断调优相关告警

I1:可能出现的异常有下面几类以及SQL自诊断调优相关告警:

1.    Spill file size large than 256MB

2.    Broadcast size large than 100MB

3.    Early spill

4.    Spill times is greater than 3

5.    Spill on memory adaptive

6.    Hash table conflict

总结一下:

  1. 因数据量变化,导致作业执行时间增加,可以分析A2/B1/D1/G1,进而确认作业查询的数据表是否有明显的数据量增加;
  2. 因其它并发作业抢占,导致作业排队,从而导致作业执行时间增加,可以分析A1/B1/D1,进而查看作业执行的同时期是否有大量并发作业在执行;
  3. 因其它作业而产生的CPU抢占,导致作业执行时间增加,可以分析A2/D1/E1,进而查看作业执行的同时期是否有大量并发作业在执行;
  4. 因其它作业而产生的IO抢占,导致作业执行时间增加,可以分析A2/F1,进而查看作业执行的同时期是否有大量并发作业在执行;
  5. I1中有结果情况,可通过提示的信息进行分析,或者进行SQL自适应诊断相关告警处理,SQL自适应诊断处理方法见:https://support.huaweicloud.com/performance-dws/dws_10_0013.html

     6. 对于enqueue异常排队的情况H1,用户可参考:GaussDB(DWS)资源管理排队原理与问题定位-云社区-华为云 (huaweicloud.com),进行问题排查分析。

值得注意的是,发生资源争抢时,可能会出现并发症,即CPUIO抢占,作业排队现象都会发生,针对并发症问题,可以逐步分析解决,比如:

       第一步,调整作业执行顺序,减少并发作业数量,减少阻塞时间;

       第二步,定位出同时段执行的典型计算密集型、存储密集型作业,先移动到其它时间段执行,减少对本作业的影响;

       第三步,在无其他作业明显干预的情况下,做进一步分析,

 

 

6、参考文献:

  1. GaussDB for DWS 负载管理核心技术解密二: 白话历史资源监视-云社区-华为云 (huaweicloud.com)
  2. GaussDB(DWS)资源管理排队原理与问题定位-云社区-华为云 (huaweicloud.com)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。