#配置资源管理

本文将介绍如何配置非容器数据库数据中的资源管理、容器数据库的PDB本地资源管理。

# 环境准备

在使用CPU资源管理前,需要先配置控制组(CGroups,Control Groups)。

# 步骤1:确认服务器已开启CGroups

CGroups是Linux内核提供的资源限制机制,主流Linux发行版(例如CentOS/RHEL 7+)默认开启该功能。可通过以下步骤进一步确定是否开启:

  1. 以安装用户登录数据库安装服务器。

  2. 执行以下命令确认是否已开启CGroups。

    $ mount | grep -E "cgroup|cgroup2"
    # 或
    $ sudo mount | grep -E "cgroup|cgroup2"
    

    若该命令无回显信息,表示未开启CGroups。此时,需先为每台服务器开启CGroups才能执行后续操作。

# 步骤2:为YashanDB创建专属cgroup目录

# 场景一:暂未安装YashanDB

YashanDB部署的【步骤1:生成配置文件】中,指定--create-cgroup选项创建cgroup目录。

# 场景二:已安装YashanDB

  1. 以安装用户登录数据库安装服务器。

  2. 通过yasboot工具的host cgroup create命令创建cgroup目录。

    $ yasboot host cgroup create --cluster yashandb --sudo-username yashan --sudo-password sudopassword
    

    Note:

    在已安装YashanDB的场景中,创建cgroup目录后按理应重启数据库。但为简化操作流程,可在后续执行激活并启用CPU资源管理操作时一并重启。

# 启用资源管理

# 步骤1:创建资源使用组

  1. 以sys用户登录数据库。

    # 本地登录时可以使用操作系统认证方式登录
    $ yasql / as sysdba
    
    # 使用密码认证方式登录
    $ yasql sys/********@192.168.1.2:1688
    
    YashanDB SQL Enterprise Edition Release {version_number} x86_64
    
    Connected to:
    YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux
    
    SQL> 
    
  2. 调用DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP创建资源使用组。

    -- 创建名为LOW_GROUP和HIGH_GROUP的资源使用组
    EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP('LOW_GROUP','CONSUMER GROUP WITH LOW RESOURCE');
    EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP('HIGH_GROUP','CONSUMER GROUP WITH HIGH RESOURCE');
    

# 步骤2:创建资源计划

调用DBMS_RESOURCE_MANAGER.CREATE_PLAN创建资源计划。

-- 创建名为RESPLAN的资源计划
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN('RESPLAN','PLAN FOR RESOURCE TEST');

# 步骤3:创建资源计划指令

调用DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE创建资源计划指令。

-- 在RESPLAN资源计划下,为LOW_GROUP资源使用组创建计划指令
-- 该计划指令指定CPU共享份额为50,最大使用上限为10%
-- 用户内存使用上限为20%,会话使用上限为5%
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    'RESPLAN', 'LOW_GROUP', SHARES => 50, UTILIZATION_LIMIT => 10, SPA_LIMIT => 20, SESSION_SPA_LIMIT => 5);

-- 在RESPLAN资源计划下,为HIGH_GROUP资源使用组创建计划指令
-- 该计划指令指定CPU共享份额为100,最大使用上限为100%
-- 用户内存使用上限为50%,会话使用上限为10%
-- 资源使用组中50%的用户内存预留给每个会话
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    'RESPLAN', 'HIGH_GROUP', SHARES => 100, UTILIZATION_LIMIT => 100, SPA_LIMIT => 50, SESSION_SPA_LIMIT => 10, SPA_LIMIT_RESERVED => 50);

# 步骤4:创建用户映射关系

调用DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING创建用户映射关系。

如果对应用户不存在,请先创建用户

-- 将用户RESMAN1映射到LOW_GROUP资源使用组和用户RESMAN2映射到HIGH_GROUP资源使用组
-- 只有SYS用户才有权限执行
EXEC DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING('USER','RESMAN1','LOW_GROUP');
EXEC DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING('USER','RESMAN2','HIGH_GROUP');

# 步骤5:激活并启用资源管理

  1. 以安装用户登录数据库安装服务器。

  2. 通过yasboot工具修改RESOURCE_MANAGER_PLAN参数,以激活资源计划RESPLAN。

    # -r参数表示修改失败后回滚集群参数
    $ yasboot cluster config set -c yashandb -k RESOURCE_MANAGER_PLAN -v RESPLAN -d -r
    
    # 可通过如下命令查看RESOURCE_MANAGER_PLAN参数是否已生效于所有节点
    $ yasboot cluster config show -c yashandb -q RESOURCE_MANAGER_PLAN
    

    Note:

    RESOURCE_MANAGER_PLAN参数只允许使用yasboot cluster config set命令修改。

  3. 以DBA用户连接并登录数据库。

    $ yasql sales/********@192.168.1.2:1688
    YashanDB SQL Enterprise Edition Release {version_number} x86_64
    
    Connected to:
    YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux
    
    SQL> 
    
  4. 检查资源计划是否成功激活,RESOURCE_MANAGER_PLAN参数值为RESPLAN表示成功激活资源计划。

    show parameter RESOURCE_MANAGER_PLAN;
    
    NAME                                                             VALUE
    ---------------------------------------------------------------- ----------------------------------------------------------------
    RESOURCE_MANAGER_PLAN                                            RESPLAN
    
  5. 通过yasboot工具修改RSRC_MODE参数开启内存(MEM)或CPU资源管理功能,随后重启数据库使之生效。

# 修改RSRC_MODE参数为ALL,表示同时启用CPU和内存资源管理功能
$ yasboot cluster config set -c yashandb -k RSRC_MODE -v ALL -d
$ yasboot cluster restart -c yashandb
# 可通过如下命令查看RSRC_MODE参数于所有节点中修改结果
$ yasboot cluster config show -c yashandb -q RSRC_MODE

Note:

RSRC_MODE参数只允许使用yasboot cluster config set命令修改。

  1. 重启后连接数据库,检查资源管理功能是否成功开启,RSRC_MODE参数值为ALL表示已成功开启。
show parameter RSRC_MODE;

NAME                                                             VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
RSRC_MODE                                                        ALL

通过上述示例成功开启资源管理功能后,使用RESMAN1用户连接数据库时会受到资源使用组LOW_GROUP在资源计划RESPLAN下的指令约束。

# 修改映射关系

如需更改某个用户映射的资源使用组,需先确保新的资源使用组已存在。下述语句仅为示例,具体参数请查阅DBMS_RESOURCE_MANAGER相关介绍。

-- 将RESMAN1映射至HIGH_GROUP组中
EXEC DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING('USER','RESMAN1','HIGH_GROUP');

修改映射关系后,用户新建的会话会归属于新的资源使用组,但已在使用中的会话会继续归属于原有资源使用组直至结束会话。

# 监控资源使用

# 监控CPU资源使用

YashanDB提供动态视图V$CPUSTATGV$CPUSTAT监控集群上资源使用组的CPU使用情况。

-- 监控资源使用组LOW_GROUP在所有节点上的CPU使用情况
SELECT RESNAME, NR_THROTTLED, THROTTLED_TIME FROM GV$CPUSTAT WHERE RESNAME = 'LOW_GROUP';

# 监控SPA内存资源使用

YashanDB提供动态视图监控资源使用组和会话的SPA内存使用情况。

# 监控资源使用组的SPA内存使用

YashanDB提供动态视图V$RSRC_CONSUMER_GROUPGV$RSRC_CONSUMER_GROUP监控集群上资源使用组的SPA内存使用情况。

-- 监控资源使用组HIGH_GOUP在所有节点上的SPA内存使用情况
SELECT SPA_LIMIT_QUOTA, SESSION_SPA_LIMIT_QUOTA, SPA_REMAIN_QUOTA, SPA_MAX_USE_QUOTA, SESSION_SPA_RESERVED_QUOTA, SPA_LIMIT_EXCEED_TIMES, 
SESSION_SPA_LIMIT_EXCEED_TIMES FROM GV$RSRC_CONSUMER_GROUP WHERE NAME = 'HIGH_GROUP';

# 监控会话的SPA内存使用

YashanDB提供动态视图V$SESSION_SPAGV$SESSION_SPA监控集群上会话的SPA内存使用情况。

-- 监控当前会话的SPA内存使用
SELECT B.*, A.SPA_USE_MEM, A.SPA_USE_QUOTA, A.RESOURCE_CONSUMER_GROUP 
FROM V$SESSION A, V$SESSION_SPA B WHERE A.SID = B.SID AND B.SID = USERENV('SID');

# 监控执行重试

存算一体分布式集群部署形态下,可以通过如下语句监控执行的重试情况。

-- 监控存算一体分布式集群下语句的执行重试情况
SELECT GROUP_ID,GROUP_NODE_ID,SID,GLOBAL_SESSION_ID,SERIAL#,SPA_USE_MEM,SPA_USE_QUOTA,SPA_MAX_USE_MEM,RESOURCE_CONSUMER_GROUP,
EXEC_START_TIME,RETRY_CNT,RETRY_INFO,EXEC_STATUS FROM GV$SESSION WHERE TYPE='USER';

# 监控并行执行资源使用

YashanDB提供动态视图V$PX_RES_MGRGV$PX_RES_MGR监控集群上资源使用组的并行执行资源使用情况。

-- 监控资源使用组HIGH_GROUP在所有节点上的并行执行资源使用情况
SELECT GROUP_ID, GROUP_NODE_ID, PX_RES_TYPE, MAX_PX_RES_USAGE, CURR_PX_RES_USAGE FROM GV$PX_RES_MGR WHERE CONSUMER_GROUP = 'HIGH_GROUP';

# 监控资源使用组内执行调度

YashanDB提供动态视图V$RSRC_CONSUMER_GROUPGV$RSRC_CONSUMER_GROUP监控集群上资源使用组执行调度情况。

-- 监控资源使用组HIGH_GROUP在所有节点上的执行调度情况
SELECT CONCURRENCY_LIMIT, CONCURRENCY_NUM, EXECUTION_WAITERS, REQUESTS, QUEUE_NUMBER, CONCURRENCY_LIMIT_HIT, 
QUEUED_TIME, QUEUE_TIMEOUTS, PARALLEL_DOWNGRADE_TIMES FROM GV$RSRC_CONSUMER_GROUP WHERE NAME = 'HIGH_GROUP';

# 监控会话内执行调度

YashanDB提供动态视图V$RSRC_SESSION_INFOGV$RSRC_SESSION_INFO监控集群上会话执行调度情况。

-- 监控资源使用组HIGH_GROUP在所有节点上的所有会话上执行调度情况
SELECT QUEUE_ID, CURRENT_QUEUED_TIME, QUEUE_TIMEOUTS, PARALLEL_DOWNGRADE_TIMES FROM GV$RSRC_SESSION_INFO WHERE CURRENT_CONSUMER_GROUP = 'HIGH_GROUP';

# 关闭资源管理

关闭资源管理需要按步骤进行:

  • 如需删除资源使用组,需先删除该资源使用组相关的映射关系和资源计划指令,否则返回错误。
  • 如需删除资源计划,需确保该资源计划不是生效计划且先删除关联到该资源计划的所有资源计划指令,否则返回错误。

# 停用资源管理

  1. 以安装用户登录数据库安装服务器。

  2. 通过yasboot工具修改RESOURCE_MANAGER_PLAN参数失效所有资源计划。

    $ yasboot cluster config set -c yashandb -k RESOURCE_MANAGER_PLAN -v '' -d -r
    # 可通过如下命令查看RSRC_MODE参数于所有节点中的修改结果
    $ yasboot cluster config show -c yashandb -q RESOURCE_MANAGER_PLAN
    
  3. 通过yasboot工具修改RSRC_MODE参数关闭资源管理功能并重启数据库,待数据库重启后生效。

    $ yasboot cluster config set -c yashandb -k RSRC_MODE -v NONE -d
    $ yasboot cluster restart -c yashandb
    # 可通过如下命令查看RSRC_MODE参数于所有节点中的修改结果
    $ yasboot cluster config show -c yashandb -q RSRC_MODE
    

# 删除用户映射关系

Note:

  • 删除用户时,该用户的映射关系会被删除。
  • 删除某个用户的映射关系时,该用户会被自动映射至DEFAULT_CONSUMER_GROUP组中。
  • 无法删除系统用户SYS的映射关系。
  1. 以sys用户登录数据库。

    # 本地登录时可以使用操作系统认证方式登录
    $ yasql / as sysdba
    
    # 使用密码认证方式登录
    $ yasql sys/********@192.168.1.2:1688
    
    YashanDB SQL Enterprise Edition Release {version_number} x86_64
    
    Connected to:
    YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux
    
    SQL> 
    
  2. 调用DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP_MAPPING删除用户映射关系。

    EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP_MAPPING('USER','RESMAN1');
    EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP_MAPPING('USER','RESMAN2');
    

# 删除资源计划指令

  1. 以sys用户登录数据库。

    # 本地登录时可以使用操作系统认证方式登录
    $ yasql / as sysdba
    
    # 使用密码认证方式登录
    $ yasql sys/********@192.168.1.2:1688
    
    YashanDB SQL Enterprise Edition Release {version_number} x86_64
    
    Connected to:
    YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux
    
    SQL> 
    
  2. 调用DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE删除资源计划指令。

    EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE('RESPLAN','LOW_GROUP');
    EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE('RESPLAN','HIGH_GROUP');
    

# 删除资源计划

  1. 以sys用户登录数据库。

    # 本地登录时可以使用操作系统认证方式登录
    $ yasql / as sysdba
    
    # 使用密码认证方式登录
    $ yasql sys/********@192.168.1.2:1688
    
    YashanDB SQL Enterprise Edition Release {version_number} x86_64
    
    Connected to:
    YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux
    
    SQL> 
    
  2. 调用DBMS_RESOURCE_MANAGER.DELETE_PLAN删除资源计划。

    如果资源计划仍有其它资源计划指令,将返回错误。

    EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN('RESPLAN');
    

# 删除资源使用组

  1. 以sys用户登录数据库。

    # 本地登录时可以使用操作系统认证方式登录
    $ yasql / as sysdba
    
    # 使用密码认证方式登录
    $ yasql sys/********@192.168.1.2:1688
    
    YashanDB SQL Enterprise Edition Release {version_number} x86_64
    
    Connected to:
    YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux
    
    SQL> 
    
  2. 调用DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP删除资源使用组。

    如果资源使用组仍有其它资源使用者,将返回错误。

    EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP('LOW_GROUP');
    EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP('HIGH_GROUP');
    
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流