: The Resource Manager
Posted dingdingfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了: The Resource Manager相关的知识,希望对你有一定的参考价值。
为保证SLA,用户要区别对待,牺牲一批人以保障一些人。
配置数据库资源管理
Oracle的资源管理与大机类似,可以保证无论负载如何,用户都可以获得约定SLA的服务。
资源管理的配置是简单的,但测试其效果和监控是难的。
资源管理的必要性
操作系统采用轮转时间片的方式分配资源,因此所有进程都是平等的,没有区别。因此Oracle的资源控制必需建立在操作系统之上。
只有在资源紧张时(有争用)时,资源管理才有必要。
本章使用的例子为一电话销售公司,有200个座席人员和10几个后台管理人员。任务类型分别为OLTP和DSS。
资源管理架构
Consumer Groups (消费组)
消费组是具有类似资源需求的一组用户。一个用户可以属于多个消费组,可以在多个消费组间切换,但任意时刻只能有一个消费组处于激活状态。
例如座席人员可属于OLTP组,后台管理人员可属于DSS组。
数据库会默认创建一些消费组:
- SYS_GROUP,系统管理组,SYS和SYSTEM用户属于此组
- DEFAULT_CONSUMER_GROUP,除SYS和SYSTEM外,所有用户的默认组
- OTHER_GROUPS,所有用户都属于此组
- 示范(Demonstration )组,用于区别不同工作负载,包括BATCH_GROUP, DSS_CRITICAL_GROUP, DSS_GROUP, ETL_GROUP, INTERACTIVE_GROUP和 LOW_GROUP。
- ORA$AUTOTASK,运行自动任务的会话属于此组。
ORA$APPQOS_0
到ORA$APPQOS_7
,在启用QoS后使用,只适用于集群系统
相关视图:DBA_RSRC_CONSUMER_GROUPS 和DBA_USERS。
示例:
set pages 9999
col CONSUMER_GROUP for a24
col comments for a100
SQL> select consumer_group, comments from dba_rsrc_consumer_groups;
CONSUMER_GROUP COMMENTS
-------------------------------- --------------------------------------------------------------------------------------------------------------
BATCH_GROUP Consumer group for batch operations
ORA$AUTOTASK Consumer group for autotask operations
INTERACTIVE_GROUP Consumer group for interactive, OLTP operations
OTHER_GROUPS Consumer group for users not included in any consumer group with a directive in the currently active plan
DEFAULT_CONSUMER_GROUP Consumer group for users not assigned to any consumer group
SYS_GROUP Consumer group for system administrators
LOW_GROUP Consumer group for low-priority sessions
ETL_GROUP Consumer group for ETL
DSS_GROUP Consumer group for DSS queries
DSS_CRITICAL_GROUP Consumer group for critical DSS queries
ORA$APPQOS_0 Consumer group for Application QOS
ORA$APPQOS_1 Consumer group for Application QOS
ORA$APPQOS_2 Consumer group for Application QOS
ORA$APPQOS_3 Consumer group for Application QOS
ORA$APPQOS_4 Consumer group for Application QOS
ORA$APPQOS_5 Consumer group for Application QOS
ORA$APPQOS_6 Consumer group for Application QOS
ORA$APPQOS_7 Consumer group for Application QOS
18 rows selected.
col username for a24
col INITIAL_RSRC_CONSUMER_GROUP for a40
SQL> select username, initial_rsrc_consumer_group from dba_users order by 2 desc, 1;
USERNAME INITIAL_RSRC_CONSUMER_GROUP
------------------------ ----------------------------------------------------------------
SYS SYS_GROUP
SYSTEM SYS_GROUP
ANONYMOUS DEFAULT_CONSUMER_GROUP
APPQOSSYS DEFAULT_CONSUMER_GROUP
AUDSYS DEFAULT_CONSUMER_GROUP
BI DEFAULT_CONSUMER_GROUP
CTXSYS DEFAULT_CONSUMER_GROUP
DBSFWUSER DEFAULT_CONSUMER_GROUP
DBSNMP DEFAULT_CONSUMER_GROUP
DIP DEFAULT_CONSUMER_GROUP
DVF DEFAULT_CONSUMER_GROUP
DVSYS DEFAULT_CONSUMER_GROUP
GGSYS DEFAULT_CONSUMER_GROUP
GSMADMIN_INTERNAL DEFAULT_CONSUMER_GROUP
GSMCATUSER DEFAULT_CONSUMER_GROUP
GSMUSER DEFAULT_CONSUMER_GROUP
HR DEFAULT_CONSUMER_GROUP
IX DEFAULT_CONSUMER_GROUP
LBACSYS DEFAULT_CONSUMER_GROUP
MDDATA DEFAULT_CONSUMER_GROUP
MDSYS DEFAULT_CONSUMER_GROUP
OE DEFAULT_CONSUMER_GROUP
OJVMSYS DEFAULT_CONSUMER_GROUP
OLAPSYS DEFAULT_CONSUMER_GROUP
ORACLE_OCM DEFAULT_CONSUMER_GROUP
ORDDATA DEFAULT_CONSUMER_GROUP
ORDPLUGINS DEFAULT_CONSUMER_GROUP
ORDSYS DEFAULT_CONSUMER_GROUP
OUTLN DEFAULT_CONSUMER_GROUP
PDBADMIN DEFAULT_CONSUMER_GROUP
PM DEFAULT_CONSUMER_GROUP
REMOTE_SCHEDULER_AGENT DEFAULT_CONSUMER_GROUP
SH DEFAULT_CONSUMER_GROUP
SI_INFORMTN_SCHEMA DEFAULT_CONSUMER_GROUP
SYS$UMF DEFAULT_CONSUMER_GROUP
SYSBACKUP DEFAULT_CONSUMER_GROUP
SYSDG DEFAULT_CONSUMER_GROUP
SYSKM DEFAULT_CONSUMER_GROUP
SYSRAC DEFAULT_CONSUMER_GROUP
WMSYS DEFAULT_CONSUMER_GROUP
XDB DEFAULT_CONSUMER_GROUP
XS$NULL DEFAULT_CONSUMER_GROUP
42 rows selected.
Resource Manager Plans(资源管理计划)
资源管理计划最常用于分配CPU资源。任意时刻只能有一个资源管理计划激活,资源管理计划控制整个实例,可管理的资源包括:
- 消费组中所有会话的CPU使用
- 组中会话的并行度
- 组中最大活动会话数
- 组中的UNODO空间限制
- 终止不活动会话的时间
- 会话中调用的最长执行时间,并可触发切换到另一消费组
相关信息可查询DBA_RSRC_PLANS 。
例如可以分为3个计划,日间计划(OLTP),夜间计划(DSS)和月末计划(BATCH)。
计划包含多个directive(指示),指示以特定的优先级将资源分配给消费组。
系统自带的计划包括:
- INTERNAL_PLAN,内部使用,禁止资源管理
- DEFAULT_PLAN,包含3个指示,第一个指示按90:9:1的比例将CPU资源分配给SYS_GROUP、OTHER_GROUPS和ORA$AUTOTASK
- DEFAULT_MAINTENANCE_PLAN,用于维护任务,留25%给其它用户
- INTERNAL_QUIESCE
- MIXED_WORKLOAD_PLAN
- ORA$AUTOTASK_PLAN
- ORA$ROOT_PLAN,只与多租户容器数据库有关
- ORA$QOS_PLAN,QoS系统使用
示例,P1, P2和P3表示Priority:
SQL> select group_or_subplan, cpu_p1, cpu_p2, cpu_p3 from dba_rsrc_plan_directives where plan='DEFAULT_PLAN';
GROUP_OR_SUBPLAN CPU_P1 CPU_P2 CPU_P3
-------------------- ---------- ---------- ----------
SYS_GROUP 90 0 0
OTHER_GROUPS 9 0 0
ORA$AUTOTASK 1 0 0
SQL> select group_or_subplan, cpu_p1, cpu_p2, cpu_p3 from dba_rsrc_plan_directives where plan='DEFAULT_MAINTENANCE_PLAN';
GROUP_OR_SUBPLAN CPU_P1 CPU_P2 CPU_P3
-------------------- ---------- ---------- ----------
SYS_GROUP 75 0 0
OTHER_GROUPS 20 0 0
ORA$AUTOTASK 5 0 0
SQL> select group_or_subplan, cpu_p1, cpu_p2, cpu_p3 from dba_rsrc_plan_directives where plan='MIXED_WORKLOAD_PLAN';
GROUP_OR_SUBPLAN CPU_P1 CPU_P2 CPU_P3
-------------------- ---------- ---------- ----------
SYS_GROUP 75 0 0
OTHER_GROUPS 2 0 0
INTERACTIVE_GROUP 20 0 0
BATCH_GROUP 2 0 0
ORA$AUTOTASK 1 0 0
资源管理采用trickle-down(滴漏)方式,某优先级中未用的资源可供下一级使用,同一级内未用的资源可供其它消费组使用。
资源管理配置
PL/SQL API,包括两个包,DBMS_RESOURCE_MANAGER_PRIVS 和 DBMS_RESOURCE_MANAGER。前者将用户放到消费组。后者用于创建消费组,资源计划和指示。资源计划只有验证有效后才会存到数据字典中。
连接时,会话将默认的消费组赋予用户,如果用户有多个消费组,可自动或手工在之间切换(DBMS_SESSION.SWITCH_CURRENT_CONSUMER_GROUP)。有管理权限的用户还可以切换其它人,利用DBMS_RESOURCE_MANAGER包中的SWITCH_CONSUMER_GROUP_FOR_USER或SWITCH_CONSUMER_GROUP_FOR_SESS。
访问和创建资源计划
计划中包括多个指示来将资源在多个消费组间划分,可通过以下的原则控制:
- CPU
- 活动会话数量
- 并行度
- 操作执行时间
- 空闲时间
- UNDO数据容量
CPU百分比(percentage)
对于本例日间计划可以这么设计:
优先级 | Group | CPU% |
---|---|---|
1 | SYS_GROUP | 100 |
2 | OLTP | 100 |
3 | DSS | 50 |
3 | BATCH | 50 |
4 | OTHER_GROUPS | 100 |
总共有8个优先级,这里用到4个。每一级的CPU总和不应超过100,否则无法通过验证。小于100可以,但不常见。 | ||
SYS_GROUP优先级应总设为最高,以防有管理任务。 |
夜间计划设计如下:
优先级 | Group | CPU% |
---|---|---|
1 | SYS_GROUP | 100 |
2 | OLTP | 50 |
2 | DSS | 25 |
2 | BATCH | 25 |
3 | OTHER_GROUPS | 100 |
月末计划设计如下: | ||
优先级 | Group | CPU% |
– | – | – |
1 | SYS_GROUP | 100 |
2 | BATCH | 100 |
3 | DSS | 50 |
3 | OLTP | 50 |
4 | OTHER_GROUPS | 100 |
CPU使用未达到100时,这些计划是不生效的。 | ||
每一个计划都必须定义OTHERS_GROUP。 | ||
计划可以有子计划,例如可以为一级单位建立计划,客户可以为二级单位制定子计划。 | ||
示例: |
-- create user defined comsumer groups
exec dbms_resource_manager.create_consumer_group( consumer_group => 'OLTP');
exec dbms_resource_manager.create_consumer_group( consumer_group => 'DSS');
exec dbms_resource_manager.create_consumer_group( consumer_group => 'BATCH');
-- create pending area
exec dbms_resource_manager.create_pending_area;
-- create plan
exec dbms_resource_manager.create_plan(plan=>'DAY', comment=>'plan for normal working hours');
-- create plan directives
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'SYS_GROUP', mgmt_p1=>100, comment=>'give sys_group users top priority');
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'OLTP', mgmt_p2=>100, comment=>'give oltp users next priority');
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'DSS', mgmt_p3=>50, comment=>'dss user have half at level3');
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'BATCH', mgmt_p3=>50, comment=>'dss user have half at level3');
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'OTHER_GROUPS', mgmt_p4=>100, comment=>'dss user have half at level3');
-- validate and submit plan
exec dbms_resource_manager.validate_pending_area;
exec dbms_resource_manager.submit_pending_area;
CPU比率(ratio)
CPU百分比指定了绝对值,如果要新增一个消费组,则必需全部调整。而使用比率就方便很多。系统会自动根据比率计算出百分比。
活动会话池
限制了消费组中并发执行语句的数量,与登录用户数无关。
活动会话是指正在执行操作或存在未提交事务的会话。
如果不能执行,会话会进入队列并永久等待,也可以设置等待超时。
例如:
execute dbms_resource_manager.update_plan_directive(plan=>'DAY', group_or_subplan=>'DSS', new_active_sess_pool_pl=>3, new_queueing_p1=>60);
相关视图,V$SESSION.CURRENT_QUEUE_DURATION
和V$RSRC_CONSUMER_GROUP
ALTER SYSTEM QUIESCE RESTRICTED
会将除SYS_GROUP外的所有活动会话池设为0,已有的会话会继续,除SYS_GROUP组中成员外新的会话不允许,相当于只有管理员可进行操作。通过ALTER SYSTEM UNQUIESCE.
进行解除。
这对于一些需要短暂排它锁的DDL操作非常有用,如重建索引。
限制并行度
无论是SELECT还是DML,并行操作可提升性能,但会影响其它用户。因此我们可以限制每一会话的最大并行进程数或禁止并行。例如:
execute dbms_resource_manager.update_plan_directive(plan=>'DAY', group_or_subplan=>'DSS', new_parallel_degree_limit_pl=>4, new_queueing_p1=>60);
执行时间
当执行时间超过阈值时切换到更低优先级的消费组。
- SWITCH_GROUP 目标组
- SWITCH_TIME 时间阈值
• SWITCH_ELAPSED_TIME 评估时间阈值,如评估启用,则评估时间超过阈值时,语句直接切换
• SWITCH_ESTIMATE 是否启用评估
• MAX_EST_EXEC_TIME 最大评估时间,如超过,则会被阻塞
空闲时间
每一个会话在服务器端都有一个进程和PGA,因此即使会话不活动,也会浪费资源。也会参与时间片轮转,也会进行上下文切换(context switch)。
根据两个标准,资源管理可以关闭会话:
- 空闲时间(未活动时间)- MAX_IDLE_TIME
- 持有行或表锁超过一定时间 - MAX_IDLE_BLOCKER_TIME
注意,空闲时间是指服务器端而非客户端,例如用户下载数据在客户端进行加工,若设置不当,会发现提交时服务器端会话已经关闭了。
限制Undo数据的产生
每一个事务都会产生undo,所有的undo数据会写到undo表空间,未提交的事务undo不允许被覆盖。因此,大事务或长事务可能将undo填满,导致其它事务无法执行。开发者可以将大事务拆成小事务。
对于DBA而言,可以利用资源管理,进行undo表空间分区,以对应不同的消费组。
V$TRANSACTION.USED_UBLK显示正在进行事务所需的undo。
当消费组中所有会话消耗的undo达到阈值时,这些会话不允许产生新的undo,因此会挂起知道有事务提交。这时,其它消费组的会话不受影响。
示例:
-- 创建4个用户
grant connect to clerk identified by clerk;
grant connect to acct identified by acct;
grant connect to batch identified by batch;
grant connect to mgr identified by mgr;
-- create consumer group
exec dbms_resource_manager.create_pending_area;
exec dbms_resource_manager.create_consumer_group( consumer_group => 'OLTP');
exec dbms_resource_manager.create_consumer_group( consumer_group => 'DSS');
exec dbms_resource_manager.submit_pending_area;
-- 将用户赋予消费组并设置初始消费组
exec dbms_resource_manager_privs.grant_switch_consumer_group('CLERK', 'OLTP', false);
exec dbms_resource_manager_privs.grant_switch_consumer_group('MGR', 'OLTP', false);exec dbms_resource_manager_privs.grant_switch_consumer_group('ACCT', 'DSS', false);
exec dbms_resource_manager_privs.grant_switch_consumer_group('BATCH', 'DSS', false);
exec dbms_resource_manager.set_initial_consumer_group('CLERK', 'OLTP');
exec dbms_resource_manager.set_initial_consumer_group('ACCT', 'DSS');
exec dbms_resource_manager.set_initial_consumer_group('BATCH', 'DSS');
exec dbms_resource_manager.set_initial_consumer_group('MGR', 'OLTP');
-- 创建plan
exec dbms_resource_manager.create_simple_plan(simple_plan=>'my_plan', consumer_group1=>'OLTP', group1_percent=>80, consumer_group2=>'DSS', group2_percent=>20);
-- 激活plan
alter system set resource_manager_plan=my_plan scope=memory;
监控资源管理
资源管理配置相关视图:
- DBA_RSRC_PLANS 资源计划与状态
- DBA_RSRC_PLAN_DIRECTIVES 指示
- DBA_RSRC_CONSUMER_GROUPS 消费组
状态:
V$SESSION
会话当前激活的消费组V$RSRC_PLAN
当前的计划V$RSRC_CONSUMER_GROUP
消费组统计
资源管理在系统不忙时无任何左右,当一个会话被资源管理影响时,在V$SESSION.EVENT
列会显示等待时间resmgr:cpu
示例,测试和监控资源管理:
-- 会话1,确认当前plan
SQL> select name from V$RSRC_PLAN;
NAME
--------------------------------
MY_PLAN
SQL> show parameter RESOURCE_MANAGER_PLAN
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_manager_plan string MY_PLAN
-- 会话1
alter system set cpu_count=1 scope=memory;
-- 会话2
sqlplus acct/acct@orclpdb1
-- 会话3
sqlplus clerk/clerk@orclpdb1
-- 会话1
SQL> select username, resource_consumer_group from v$session where username is not null;
USERNAME RESOURCE_CONSUMER_GROUP
---------- --------------------------------
SYS _ORACLE_BACKGROUND_GROUP_
CLERK OLTP
ACCT DSS
SYSTEM OTHER_GROUPS
SQL> select name, active_sessions, consumed_cpu_time from v$rsrc_consumer_group;
NAME ACTIVE_SESSIONS CONSUMED_CPU_TIME
-------------------------------- --------------- -----------------
DSS 0 0
OLTP 0 0
OTHER_GROUPS 1 211
-- 会话2 和 会话3 同时执行
select count(*) from all_objects, all_objects;
-- 会话1 结果应显示OLTP消耗CPU是DSS的4倍(我的结果不是)
select name, active_sessions, consumed_cpu_time from v$rsrc_consumer_group;、
SQL> select name, active_sessions, consumed_cpu_time from v$rsrc_consumer_group;
NAME ACTIVE_SESSIONS CONSUMED_CPU_TIME
-------------------------------- --------------- -----------------
DSS 1 71842
OLTP 1 71719
OTHER_GROUPS 1 49
-- 会话1
SQL> select s.username, e.event, e.time_waited from v$session_event e join v$session s using (sid) where e.event like 'resmgr:cpu%';
USERNAME EVENT TIME_WAITED
---------- ------------------------------ -----------
resmgr:cpu quantum 13
resmgr:cpu quantum 53
resmgr:cpu quantum 58
CLERK resmgr:cpu quantum 7497
resmgr:cpu quantum 31
resmgr:cpu quantum 0
resmgr:cpu quantum 55
resmgr:cpu quantum 57
ACCT resmgr:cpu quantum 7626
resmgr:cpu quantum 372
SYSTEM resmgr:cpu quantum 2226
resmgr:cpu quantum 5
resmgr:cpu quantum 2
13 rows selected.
参考
- https://oracle-base.com/articles/8i/resource-manager-8i
以上是关于: The Resource Manager的主要内容,如果未能解决你的问题,请参考以下文章
jedis连接集群报Could not get a resource from the pool错误
转The requested resource (/) is not available
Resource is out of sync with the file system
HTTP Status 404(The requested resource is not available)异常解决