
# 技术原理
#### 核心机制
本特性功能由以下三个线程配合实现，各线程核心功能如下：
- 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流程   
![](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/figure/zh-cn_image_0000002590204798.png)
![](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- 不支持对临时表进行ANALYZE。
- 对于M兼容性，仅支持发送ANALYZE命令，不支持WITH GLOBAL等。
- LIBPQ发送ANALYZE命令建连超时时间为10秒，读写超时时间为10分钟。
 
#### 接口介绍
慢SQL管控主要使用以下Schema，具体描述请参见《参考》中"Schema \> DBE_PERF Schema \> Query"章节。
表1Schema 
| 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参数说明 \> 负载管理"章节。
表4GUC参数 
| 参数名                                  | 参数说明                                                                                                |
|:---|:---|
| 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的扩展模式。                                                                                 |
   
