query_band负载识别
概述
GaussDB(DWS)实现基于query_band的负载识别和队列内优先级控制,一方面提供了更为灵活的负载识别手段,可根据作业类型、应用名称、脚本名称等识别负载队列,使用户根据业务场景可灵活配置query_band识别队列;另一方面实现了队列内作业下发优先级控制,后续将逐步实现队列内资源优先级控制。
管理员用户可根据业务场景及作业类别配置query_band所关联队列及估算内存限制等实现更为灵活的负载控制与资源管控。如果业务未配置query_band或用户未将query_band关联行为时,作业会默认使用用户关联队列和队列内优先级。
query_band支持的负载行为
query_band是一个session级别的GUC参数,作为作业标识符本身没有特殊含义,数据类型为字符型,支持赋值任何字符串。但是为方便区分和设置,query_band负载识别仅支持识别键值对形式的query_band,示例:
SET query_band='JobName=abc;AppName=test;UserName=user';
其中,‘JobName=abc’,‘AppName=test’以及‘UserName=user’都是一个独立的键值对。query_band键值对规格:
- query_band使用键值对方式设置,即'key=value';session内支持设置多个query_band键值对,多个键值对之间使用分号分隔。query_band键值对和query_band参数值长度的上限均为1024个字符。
- query_band键值对支持的有效字符包括:数字0~9、大写字母A~Z、小写字母a-z、'.'、'-'、'_' 以及'#'。
query_band负载识别以键值对为单位设置和识别负载行为,目前支持的负载行为,如表1所示:
类别 |
行为 |
行为表现 |
---|---|---|
负载管理(workload) |
资源池(respool) |
query_band关联资源池 |
负载管理(workload) |
优先级(priority) |
队列内优先级 |
次序(order) |
队列(respool) 目前为无效字段,主要用于后续扩展。 |
query_band搜索次序 |
其中,行为类别用于负载行为归类,不同的负载行为可能属于同一个类别,比如资源池和优先级同属于负载管理类别;负载行为代表query_band键值对关联的是哪种负载行为;行为表现用于记录具体的负载行为是什么;负载类别中的次序用于标记query_band负载行为识别的优先级,一个session内设置多个query_band键值对时,优先使用次序较小的query_band键值对识别负载行为。每一个query_band键值对都可以对应0个或多个负载行为,但是一种负载行为只能关联一个。query_band负载行为详细说明如下:
- 资源池:query_band支持关联资源池,作业执行时,若query_band指定了资源池,则使用query_band关联的资源池,否则使用用户关联的资源池。
- query_band关联资源池时,资源池不存在报错退出,关联失败。
- query_band关联资源池时,记录query_band与资源池依赖关系。
- query_band关联资源池删除时,提示有query_band依赖,资源池删除失败。
- 队列内优先级:query_band支持关联作业优先级,支持高中低(High/Medium/Low)三个优先级,同时提供Rush作为特殊优先级(绿色通道),默认优先级为Medium。正常实践过程中,大部分作业使用Medium优先级,优先级较低作业使用Low优先级,特权作业使用High优先级,High作业不建议过多。Rush优先级作为特殊场景下应急使用,平时不建议使用。
- 静态负载管理场景下,CN并发不足时,触发CN全局队列排队,CN全局队列为优先级队列。
- 动态负载管理场景下,DN内存不足时,触发CCN全局队列排队,CCN全局队列为优先级队列。
- 资源池并发或内存不足时,触发资源池排队,资源池队列为优先级队列。
以上优先级队列均遵守以下调度规则:
- 优先级高作业优先调度。
- 优先级高作业全部调度完之后调度优先级低作业。
- 动态负载管理场景下,CN全局队列不支持query_band优先级。
- 次序:支持设置query_band识别次序,未设置识别次序的使用默认次序-1。除默认次序外,不存在次序相同的两个query_band。设置次序时对query_band次序进行校验,存在相同次序时,已存在次序递归+1直到不存在相同次序为止。
- session内设置多个query_band键值对时,使用次序较小的query_band键值对作为负载识别的query_band。
- 次序最小为0,默认次序-1为最大次序。
- 次序都为默认次序时,使用设置靠前的query_band作为负载识别的query_band。
- 示例:set query_band='b=1;a=3;c=1'; b=1,其中b=1次序-1,a=3次序4,c=1次序1,则使用c=1作为负载识别的query_band,此设计可提供负载管理员对负载调度调整能力。
query_band应用与配置
- pg_workload_action跨库系统表用于存储query_band行为和次序,详见PG_WORKLOAD_ACTION。
- 默认行为和次序在系统表pg_workload_action不存储,query_band有设置非默认行为的,查询其行为默认行为也显示;查询行为和次序都为默认的query_band行为时,显示<query_band information not found>。
- gs_wlm_set_queryband_action函数用于设置query_band行为:其中第一个参数即queryband键值对的长度上限为63个字符;第二个参数action不区分大小写,多个action使用分号分隔;order为缺省参数,默认为-1。具体请参见gs_wlm_set_queryband_action。
- gs_wlm_set_queryband_order函数设置query_band次序:其中第一个参数即queryband键值对的长度上限为63个字符;query_band次序必须大于等于-1,除默认次序-1外不存在两个次序相同的query_band。设置query_band次序时如果存在相同次序的query_band,则将原query_band次序+1。具体请参见gs_wlm_set_queryband_order。
- gs_wlm_get_queryband_action函数用于查询query_band行为,具体请参见gs_wlm_set_queryband_action。
- pg_queryband_action系统视图用于查询所有query_band行为,具体请参见 PG_QUERYBAND_ACTION。
- query_band优先级在负载管理视图(PG_SESSION_WLMSTAT)中显示为int型,数字和优先级的对应关系如下:
- 0:表示该作业不受负载管理管控;
- 1:LOW;
- 2:MEDIUM;
- 4:HIGH;
- 8:RUSH;
- 权限控制:除初始用户外,被授权用户才具有设置和查询query_band权限。
批量取消所有运行作业或队列并发上限是1且只有一个队列有作业运行的情况下,可能会触发CN自动唤醒作业导致作业不按照优先级下发。
示例
- 设置query_band“JobName=abc”关联资源池p1、队列内优先级Rush、次序为1。
1 2 3 4 5
SELECT * FROM gs_wlm_set_queryband_action('JobName=abc','respool=p1;priority=rush',1); gs_wlm_set_queryband_action ----------------------------- t (1 row)
- 修改query_band“JobName=abc”的关联资源池为p2。
1 2 3 4 5
SELECT * FROM gs_wlm_set_queryband_action('JobName=abc','respool=p2'); gs_wlm_set_queryband_action ----------------------------- t (1 row)
- 修改query_band“JobName=abc”的队列内优先级为High。
1 2 3 4 5
SELECT * FROM gs_wlm_set_queryband_action('JobName=abc','priority=high'); gs_wlm_set_queryband_action ----------------------------- t (1 row)
- 修改query_band“JobName=abc”的次序为3。
1 2 3 4 5
SELECT * FROM gs_wlm_set_queryband_order('JobName=abc',3); gs_wlm_set_queryband_order ----------------------------- t (1 row)
- 查询query_band关联的负载行为。
1 2 3 4 5 6
SELECT * FROM pg_queryband_action; qband | respool_id | respool | priority | qborder --------------+------------+---------+----------+--------- AppName=test | 16974 | p1 | low | -1 JobName=abc | 17119 | p2 | high | 1 (2 rows)