更新时间:2024-11-05 GMT+08:00

query_band负载识别

概述

GaussDB(DWS)实现基于query_band的负载识别和队列内优先级控制,一方面提供了更为灵活的负载识别手段,可根据作业类型、应用名称、脚本名称等识别负载队列,使用户根据业务场景可灵活配置query_band识别队列;另一方面实现了队列内作业下发优先级控制,后续将逐步实现队列内资源优先级控制。

管理员用户可根据业务场景及作业类别配置query_band所关联队列及估算内存限制等实现更为灵活的负载控制与资源管控。如果业务未配置query_band或用户未将query_band关联行为时,作业会默认使用用户关联队列和队列内优先级。

query_band支持的负载行为

query_band是一个session级别的GUC参数,作为作业标识符,本身没有特殊含义,数据类型为字符型,支持赋值任何字符串。但是为方便区分和设置,query_band负载识别仅支持识别键值对形式的query_band,示例:

1
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所示:

表1 QUERY_BAND支持负载行为

类别

行为

行为表现

负载管理(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自动唤醒作业导致作业不按照优先级下发。

示例

  1. 设置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)
    

  2. 修改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)
    

  3. 修改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)
    

  4. 修改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)
    

  5. 查询query_band关联的负载行为。

    1
    2
    3
    4
    5
    SELECT * FROM pg_queryband_action;
        qband     | respool_id | respool | priority | qborder
    --------------+------------+---------+----------+---------
     JobName=abc  |      17119 | p2      | high     |       1
    (1 row)
    

  6. 设置query_band“AppName=test”队列内优先级Low,使用用户关联资源池,同时使用默认次序。

    1
    2
    3
    4
    5
    SELECT * FROM gs_wlm_set_queryband_action('AppName=test','priority=low');
    gs_wlm_set_queryband_action
    -----------------------------
     t
    (1 row)
    

  7. 查询query_band关联的负载行为。

    1
    2
    3
    4
    5
    6
    SELECT * FROM pg_queryband_action;
        qband     | respool_id | respool | priority | qborder
    --------------+------------+---------+----------+---------
     AppName=test |          0 | NULL    | low      |      -1
     JobName=abc  |      16754 | p2      | high     |       3
    (2 rows)
    

  8. 取消query_band“JobName=abc”关联的所有负载行为,设置为默认行为即可。

    1
    2
    3
    4
    5
    6
    7
    SELECT * FROM gs_wlm_set_queryband_action('JobName=abc','respool=null;priority=medium',-1);
    NOTICE:  The respool of query_band(JobName=abc) will be removed.
    NOTICE:  The priority of query_band(JobName=abc) will be removed.
     gs_wlm_set_queryband_action
    -----------------------------
     t
    (1 row)
    

  9. 查询query_band关联的负载行为。

    1
    2
    3
    4
    5
    SELECT * FROM pg_queryband_action;
        qband     | respool_id | respool | priority | qborder
    --------------+------------+---------+----------+---------
     AppName=test |          0 | NULL    | low      |      -1
    (1 row)