#配置资源管理
YashanDB资源管理通过内置高级包DBMS_RESOURCE_MANAGER和相关配置参数提供对物理资源的配置能力。
# 启用资源管理
# 创建资源使用组
调用DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP创建资源使用组。
-- 创建名为LOW_GROUP和HIGH_GROUP的资源使用组,只有SYS用户才有权限执行
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');
# 创建资源计划
调用DBMS_RESOURCE_MANAGER.CREATE_PLAN创建资源计划。
-- 创建名为RESPLAN的资源计划,只有SYS用户才有权限执行
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN('RESPLAN','PLAN FOR RESOURCE TEST');
# 创建资源计划指令
调用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);
# 创建用户映射关系
调用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');
# 修改相关配置参数
- 通过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
命令修改。
- 连接数据库,检查资源计划是否成功激活,
RESOURCE_MANAGER_PLAN
参数值为RESPLAN表示成功激活资源计划。
show parameter RESOURCE_MANAGER_PLAN;
NAME VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
RESOURCE_MANAGER_PLAN RESPLAN
- 通过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
命令修改。
- 重启后连接数据库,检查资源管理功能是否成功开启,
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');
修改映射关系后,用户新建的会话会归属于新的资源使用组,但已在使用中的会话会继续归属于原有资源使用组直至结束会话。
# 配置Cgroups
使用CPU资源管理前,需要先配置Cgroups。
# Cgroups介绍
Cgroups(Control Groups)是Linux内核提供的一种机制,将一系列的任务及其子任务进行集合(或划分)到不同的分组内,并以此限制、记录和隔离不同分组的资源使用情况。
# Cgroups创建
# 场景一:暂未安装YashanDB
在YashanDB单机部署或YashanDB分布式部署的
Step1:生成部署文件
中,增加--create-cgroup
选项,用于创建cgroup目录。执行如下命令,生成具备CPU资源管理功能的部署文件。
# 单机
$ yasboot package se gen --cluster yashandb -u yashan -p password --ip 192.168.1.2 --port 22 --install-path /data/yashan/yasdb_home --data-path /data/yashan/yasdb_data --begin-port 1688 --create-cgroup --sudo-username yashan --sudo-password password
# 分布式
$ yasboot package de gen --cluster yashandb -u yashan -p password --ip 192.168.1.2 --port 22 --install-path /data/yashan/yasdb_home --data-path /data/yashan/yasdb_data --begin-port 1688 --create-cgroup --sudo-username yashan --sudo-password password
部署完成后,会自动在/etc/rc.local文件中增加一行命令,以便在数据库启动后启用CPU资源管理功能。
# 场景二:已安装YashanDB
通过yasboot工具的host cgroup create
命令创建cgroup目录,详细参数说明请查阅yasboot host。
$ yasboot host cgroup create --cluster yashandb --sudo-username yashan --sudo-password ssh密码
命令执行完成后需重启数据库才能启用CPU资源管理功能。
# 监控资源使用
# 监控CPU资源使用
YashanDB提供动态视图V$CPUSTAT、DV$CPUSTAT和GV$CPUSTAT监控集群上资源使用组的CPU使用情况。
-- 监控资源使用组LOW_GROUP在所有节点上的CPU使用情况
SELECT RESNAME, NR_THROTTLED, THROTTLED_TIME FROM DV$CPUSTAT WHERE RESNAME = 'LOW_GROUP';
# 监控SPA内存资源使用
YashanDB提供动态视图监控资源使用组和会话的SPA内存使用情况。
# 监控资源使用组的SPA内存使用
YashanDB提供动态视图V$RSRC_CONSUMER_GROUP、DV$RSRC_CONSUMER_GROUP和GV$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 DV$RSRC_CONSUMER_GROUP WHERE NAME = 'HIGH_GROUP';
# 监控会话的SPA内存使用
YashanDB提供动态视图V$SESSION_SPA、DV$SESSION_SPA和GV$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 DV$SESSION WHERE TYPE='USER';
# 监控并行执行资源使用
YashanDB提供动态视图V$PX_RES_MGR、DV$PX_RES_MGR和GV$PX_RES_MGR监控集群上资源使用组的并行执行资源使用情况。
-- 监控资源使用组HIGH_GROUP在所有节点上的并行执行资源使用情况
SELECT GROUP_ID, GROUP_NODE_ID, PX_RES_TYPE, MAX_PX_RES_USAGE, CURR_PX_RES_USAGE FROM DV$PX_RES_MGR WHERE CONSUMER_GROUP = 'HIGH_GROUP'
# 关闭资源管理
关闭资源管理需要按步骤进行:
- 如需删除资源使用组,需先删除该资源使用组相关的映射关系和资源计划指令,否则返回错误。
- 如需删除资源计划,需确保该资源计划不是生效计划且先删除关联到该资源计划的所有资源计划指令,否则返回错误。
# 修改相关配置参数
- 通过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
- 通过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
# 删除用户映射关系
调用DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP_MAPPING删除用户映射关系。
Note:
- 删除用户时,该用户的映射关系会被删除。
- 删除某个用户的映射关系时,该用户会被自动映射至DEFAULT_CONSUMER_GROUP组中。
- 无法删除系统用户SYS的映射关系。
EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP_MAPPING('USER','RESMAN1');
EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP_MAPPING('USER','RESMAN2');
# 删除资源计划指令
调用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');
# 删除资源计划
调用DBMS_RESOURCE_MANAGER.DELETE_PLAN删除资源计划。
如果资源计划仍有其它资源计划指令,将返回错误。
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN('RESPLAN');
# 删除资源使用组
调用DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP删除资源使用组。
如果资源使用组仍有其它资源使用者,将返回错误。
EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP('LOW_GROUP');
EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP('HIGH_GROUP');