更新时间:2026-07-28 GMT+08:00
分享

技术原理

核心机制

本特性功能由以下三个线程配合实现,各线程核心功能如下:

  • Throttler线程
    • 更新异常SQL的最大CPU可用时间(更新throttle异常Cgroup组CPU使用率控制上限百分比,可通过abnormal_sql_cpu_limit()查看)。
    • 判断GaussDB进程整体CPU时间是否紧张(CPU使用时间占总运行时间的比重是否超过abnormal_sql_cpu_util_percent参数取值),若紧张则业务线程(Worker线程或ThreadPoolWorker线程)需开始限制自身CPU可用时间,限制逻辑详见下方Woker或ThreadPoolWoker线程
    • 对于可管控的异常SQL按照图1执行自动ANALYZE,ANALYZE命令由libpq发送。
  • AbnormalSqlCpuWorker线程
    • 获取DBE_PERF.ABNORMAL_SQL视图中执行消耗CPU时间最多的异常SQL,判断其是否符合管控条件(此异常SQL执行消耗CPU时间占GaussDB进程整体CPU时间的30%以上、此异常SQL出现次数达到abnormal_sql_effective_count参数取值、此异常SQL的管控结束时间abnormal_sql_control_duration大于当前时间),符合则将其标记为可管控状态。
  • Worker或ThreadPoolWoker线程
    • 判断当前SQL执行的时间是否超过同类SQL的平均时间的abnormal_sql_effective_count倍且是否为abnormal_sql_control_type中记录的类型,若是则识别为异常SQL并记录到DBE_PERF.ABNORMAL_SQL。
    • 获取Throttler线程对于GaussDB进程CPU时间是否紧张的判断结果,若紧张则判断自身执行的SQL是否为AbnormalSqlCpuWorker线程标记的可管控异常SQL,若是则限制当前线程的CPU可用时间(修改Cgroup组为throttle异常Cgroup组),待SQL执行完成后解放此线程的CPU可用时间限制(放回原Cgroup组中)。
    • 对于可管控的异常SQL会上报至Throttler线程,并交由该线程对该查询相关的基表执行自动ANALYZE。
图1 异常SQL自动ANALYZE流程
  • 不支持对临时表进行ANALYZE。
  • 对于M兼容性,仅支持发送ANALYZE命令,不支持WITH GLOBAL等。
  • LIBPQ发送ANALYZE命令建连超时时间为10秒,读写超时时间为10分钟。

接口介绍

慢SQL管控主要使用以下Schema,具体描述请参见《参考》中“Schema > DBE_PERF Schema > Query”章节。

表1 Schema

Schema名

Schema说明

DBE_PERF.ABNORMAL_SQL

查询所有异常SQL信息的视图。查看该视图需要MONITORADMIN权限。

DBE_PERF.ABNORMAL_SQL_ALLOWLIST

该视图用于显示异常SQL的白名单,加入白名单的异常SQL不接受CPU时间管控。查看需要MONITORADMIN权限。

慢SQL管控主要使用以下系统函数,具体描述请参见《参考》中“SQL参考 > 函数和操作符 > SQL限流函数”章节。

表2 系统函数

函数名

函数说明

abnormal_sql_manage_allowlist ('operation', 'unique_sql_id')

在白名单上添加或删除异常SQL信息,加入审计白名单。需要具有SYSADMIN、MONITORADMIN权限的用户才可执行。

clean_abnormal_sql('operation', 'unique_sql_id')

清理被CPU时间管控的异常SQL,并加入到审计白名单。需要具有SYSADMIN、MONITORADMIN权限的用户才可执行。

add_abnormal_sql('unique_sql_id')

手动添加需要被CPU时间管控的异常SQL,将其加入到异常SQL管理名单中。仅具有SYSADMIN、MONADMIN权限的用户可执行该操作。该函数添加异常SQL需要保证enable_abnormal_sql_cpu_detect识别异常SQL功能开关开启。

abnormal_sql_cpu_limit()

获取throttle异常Cgroup组CPU使用率控制上限百分比。需要具有SYSADMIN、MONITORADMIN权限的用户才可执行。多租数据库特性(enable_mtd)开启时,本函数失效。

慢SQL管控主要使用以下系统表,具体描述请参见《参考》中“系统表和系统视图 > 系统表 > 负载管理”章节。

表3 系统表

表名

表说明

GS_ABNORMAL_SQL_INFO

提供了数据库CPU使用异常的SQL的信息,数据来源于DBE_PERF.ABNORMAL_SQL视图,每10s系统表从视图同步一次。

GS_ABNORMAL_SQL_WHITE_LIST

提供了数据库CPU使用异常SQL白名单的信息,数据来源于DBE_PERF.ABNORMAL_SQL_ALLOWLIST视图。

慢SQL管控主要使用以下GUC参数,具体描述请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 负载管理”章节。

表4 GUC参数

参数名

参数说明

enable_abnormal_sql_cpu_detect

识别异常SQL的功能开关。

abnormal_sql_cpu_util_percent

用于设定异常SQL CPU时间管控功能的GaussDB进程CPU使用率阈值,当GaussDB CPU时间占用率达到设置阈值时,管控功能生效。多租数据库特性(enable_mtd)开启时,本参数失效。

abnormal_sql_cpu_hist_multiplier

异常SQL CPU耗时超过历史均值倍数的标准。

abnormal_sql_effective_count

检测到SQL使用CPU时间超过历史均值倍数(abnormal_sql_cpu_hist_multiplier)的次数。

abnormal_sql_control_duration

异常SQL接受CPU时间管控的持续时间。

abnormal_sql_control_type

异常SQL需要被CPU管控的类型。

resilience_ctrlstmt_detect_timelimit

Worker或ThreadPoolWoker线程执行SQL过程中检查识别异常SQL的时间间隔。

autoanalyze_ext_mode

控制触发自动ANALYZE的扩展模式。

相关文档