课程目标:
- 配置数据库资源管理器
- 访问和创建资源计划
- 创建使用者组
- 为使用者组分配的资源指定指令
- 映射使用者组到计划
- 激活资源计划
- 监控资源管理器
1、数据库资源管理器:概览
相比只通过操作系统管理资源,使用数据库资源管理器可以对机器资源有更多的控制。如果只是由操作系统管理资源,可能有导致如下问题:
- 当服务器进程数量很多时,它们进行上下文切换会消耗过多资源
- 有闩锁的数据库服务器进程的暂挂
- 资源在数据库服务器进程间的不均衡分布,无法优先处理某些任务
- 无法管理数据库某些特定资源,例如并行执行服务器和活动会话
通过控制数据库中的执行调度,数据库资源管理器在不同会话间控制资源的分布。通过控制哪一个会话运行以及运行多长时间,数据库资源管理器可以确保资源分布匹配计划指令。不管系统的负载如何以及多少用户在使用,都可以保证用户组的最小处理资源。
DBMS_RESOURCE_MANAGER_PRIVS程序包包含授予和撤销ADMINISTER_RESOURCE_MANAGER系统权限的过程,该权限是调用资源管理器的先决条件。
2、数据库资源管理器:概念
数据库资源管理器包括资源计划、资源使用者组和资源计划指令。
资源使用者组定义了对系统和数据库资源有相似要求的一组用户或者会话。
资源计划指定如何将资源分布到各个资源使用者组。也可以在资源计划里创建子计划。
资源计划指令指定在资源使用者组或者子计划之间如何共享指定的资源。通过资源计划指令关联资源使用者组(或者子计划)和特定的资源计划。
资源分配方法确定当分配特定资源时使用哪一种策略。由资源计划和资源使用者组使用。
3、为什么使用资源管理器
数据库资源管理器提供如下几种方式来分配资源:
- CPU Method:可以指定在使用者组和子计划间如何分配CPU资源。
- Degree of Parallelism Limit:可以控制使用者组操作的最大并行度。
- Active Session Pool with Queuing:为使用者组和子计划限制并发活动会话数量。如果某个使用者组超过了最大允许的会话数量,则新的会话就需要等待。还可以指定会话报错退出的等待时间。
- Undo Pool:控制使用者组或者子计划产生的undo总量。当总的undo空间超过了UNDO_POOL指定的总量,则不允许新的插入、更新和删除操作,可以通过同一使用者组的其他会话释放undo空间或者增大使用者组的undo空间来解决该问题。如果在执行DML操作过程中超过了指定的总量,则操作会失败并返回错误。但是不会影响查询。
- Execution Time Limit:为某个操作指定最大的执行时间。Oracle通过CBO统计数据估算最长执行时间,如果超过了设定的时间(MAX_EST_EXEC_TIME),则会返回一个错误且不会进行该操作。如果资源使用者组有多个指定了MAX_EST_EXEC_TIME的计划指令,则资源管理器将选择所有传入值中限制性最强的那个值。
- Idle Time Limit:指定会话空闲的时间(MAX_IDLE_TIME),超时后会话会被终止。还可以指定资源管理器终止那些阻塞其他会话的会话。(MAX_IDLE_TIME_BLOCKER)。
- Consumer Group Switching:使用者组切换。初始使用者组是在会话刚登录时所属的组。顶层调用被定义为将整个PL/SQL 块视为一个调用,或类似地,将客户机单独发出的SQL 语句视为单独调用。在中间层服务器实施会话共享的三层应用模型中,此功能的优势是最显而易见的。在这种情况下,中间层在为某个最终用户执行一个调用后,可使用相同的会话为另一个最终用户执行调用。因此,工作的分界线实际上为调用,并且上一个最终用户的操作不会影响下一个最终用户。可以创建一个计划指令,使资源管理器在顶层调用结束时将用户自动切换回初始使用者组。
注意:不能在一个指令中同时指定SWITCH_TIME_IN_CALL和SWITCH_TIME参数。SWITCH_TIME参数主要用于客户端/服务器应用,而SWITCH_TIME_IN_CALL参数主要用于三层应用(B/S)。 - Database Consolidation:数据库合并。资源管理器可以在多个并发数据库会话中优化资源分配。Database Consolidation要求各个应用相互独立,一个应用的负载增加不会对其他应用产生影响,保持应用的可用资源在合理范围内。例如对会占用服务器CPU100%的自动维护任务就可以应用Database Consolidation限制资源使用。
- Server Consolidation:服务器合并。为服务器上的多个数据库实例分配资源。可以使用实例限制的技术在多CPU环境为多个数据库实例分配CPU。
可以通过EM或者DBMS_RESOURCE_MANAGER包访问资源计划。
4、默认维护任务资源管理器计划
自动维护任务依赖于在维护窗口期间开启的资源管理器,当维护窗口打开,DEFAULT_MAINTENANCE_PLAN资源管理器计划自动控制维护任务使用的CPU总量。为了在维护窗口中给不同的任务不同的优先级,给DEFAULT_MAINTENANCE_PLAN指定了不同的使用者组。使用者组和计划的层级关系如上图所示。
对于高优先级任务,使用者组分配如下:
- Optimizer Statistics Gathering任务在ORA$AUTOTASK_STATS_GROUP使用者组。
- Segment Advisor任务在ORA$AUTOTASK_SPACE_GROUP使用者组。
- Automatic SQL Tuning在ORA$AUTOTASK_SQL_GROUP使用者组。
如果需要,可以在ORA$AUTOTASK_HIGH_SUB_PLAN中各个自动维护任务使用者组的CPU资源分配百分比。
例子:查看数据库当前资源管理器计划
SQL> show parameter resource_manager_plan
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_manager_plan string
5、示例:DEFAULT_PLAN
DEFAULT_PLAN是Oracle提供的默认资源计划之一,为以下使用者组和子计划提供指令:
- SYS_GROUP:SYS和SYSTEM用户的初始使用者组。
- OTHER_GROUPS:用于不在活动资源计划中的使用者组的会话。任何活动计划必须为OTHER_GROUPS指定资源计划指令。
- ORA$AUTOTASK_SUB_PLAN:自动维护任务的默认子计划。此计划中优先级低于SYS_GROUP和OTHER_GROUPS的组。
- ORA$DIAGNOSTICS:与ORA$AUTOTASK_SUB_PLAN优先级一样,带有$ORA前缀的低优先级组防止自动维护任务消耗大量的系统资源。
用户的初始使用者组是该用户创建的任何会话最初所属的使用者组。如果没有为用户设置初始使用者组,用户的初始使用者组自动为DEFAULT_CONSUMER_GROUP。
可以使用也可以不使用DEFAULT_PLAN和相关的资源使用者组。可以作为新的资源计划的模版,可以修改和删除。
6、潜在的工作流
创建新的资源计划,需要配置以下资源管理器对象:
创建一个新的资源计划
调度程序可以在调度程序窗口范围内自动更改资源管理器计划。如果不希望使用自动切换,则取消选中默认的“Automatic Plan Switching Enabled(已启用自动计划切换)”复选框。
创建使用者组
使用EM中的使用者组页面创建或者编辑使用者组和描述。增加或者删除成员和角色。
可以指定使用者组中各个会话间CPU的分配方式。默认的”Round Robin(循环)”方式确保每个会话平均使用CPU,“Round to Completion(运行至完成)”方式给指定优先处理活动时间最长的会话。也可以通过DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP存储过程的MGMT_MTH选项来实现。
给资源使用者组指定用户
需要给资源使用者组指定用户。用户的默认使用者组是用户创建的任何会话最初所属的组。如果没有为用户设置使用者组,则用户的初始使用者组默认为DEFAULT_CONSUMER_GROUP。必须先直接向用户(或者PUBLIC)授予切换到某个使用者组的切换权限,然后才能使该使用者组成为用户的默认使用者组。切换权限不能从授予给用户的角色继承。
DBMS_RESOURCE_MANAGER_PRIVS包中包含了给资源使用者组指定用户的存储过程。给用户授予切换权限以使用户可以切换到不同的使用者组。
例子:使用EM创建使用者组
例子:使用命令创建使用者组
SQL> exec dbms_resource_manager.clear_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.create_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.create_consumer_group(consumer_group=>'appuser',mgmt_mth=>'round-robin',comment=>'');
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.submit_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager_privs.grant_switch_consumer_group(grantee_name=>'HR',consumer_group=>'APPUSER',grant_option=>false);
PL/SQL procedure successfully completed.
SQL> select consumer_group,cpu_method,mgmt_method from DBA_RSRC_CONSUMER_GROUPS where consumer_group='APPUSER';
CONSUMER_GROUP CPU_METHOD MGMT_METHOD
------------------------------ ------------------------------ ------------------------------
APPUSER ROUND-ROBIN ROUND-ROBIN
SQL> select * from DBA_RSRC_CONSUMER_GROUP_PRIVS where granted_group='APPUSER';
GRANTEE GRANTED_GROUP GRA INI
------------------------------ ------------------------------ --- ---
HR APPUSER NO NO
例子:使用EM创建资源计划
DECLARE
spfileValueVARCHAR2(1000);
scopeValueVARCHAR2(10):='MEMORY';
planNameVARCHAR2(100):=?;
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.create_plan(plan=>?,comment=>?,max_iops=>?,max_mbps=>?);
dbms_resource_manager.create_plan_directive(
plan=>?,
group_or_subplan=>?,
comment=>?,
max_utilization_limit=>?,
mgmt_p1=>?,mgmt_p2=>?,mgmt_p3=>?,mgmt_p4=>?,
mgmt_p5=>?,mgmt_p6=>?,mgmt_p7=>?,mgmt_p8=>?,
parallel_degree_limit_p1=>?,
parallel_target_percentage=>?,
parallel_queue_timeout=>?,
switch_io_reqs=>?,
switch_io_megabytes=>?
,
active_sess_pool_p1=>?,
queueing_p1=>?,
switch_group=>?,
switch_time=>?,
switch_estimate=>case?when'false'thenfalsewhen'true'thentrueelsefalseend,
undo_pool=>?,
max_idle_time=>?,
max_idle_blocker_time=>?,
switch_for_call=>case?when'false'thenfalsewhen'true'thentrueelsefalseend
);
dbms_resource_manager.create_plan_directive(
plan=>?,
group_or_subplan=>?,
comment=>?,
max_utilization_limit=>?,
mgmt_p1=>?,mgmt_p2=>?,mgmt_p3=>?,mgmt_p4=>?,
mgmt_p5=>?,mgmt_p6=>?,mgmt_p7=>?,mgmt_p8=>?,
parallel_degree_limit_p1=>?,
parallel_target_percentage=>?,
parallel_queue_timeout=>?,
switch_io_reqs=>?,
switch_io_megabytes=>?
,
active_sess_pool_p1=>?,
queueing_p1=>?,
switch_group=>?,
switch_time=>?,
switch_estimate=>case?when'false'thenfalsewhen'true'thentrueelsefalseend,
undo_pool=>?,
max_idle_time=>?,
max_idle_blocker_time=>?,
switch_for_call=>case?when'false'thenfalsewhen'true'thentrueelsefalseend
);
dbms_resource_manager.submit_pending_area();
selectvalueintospfileValuefromv$parameterwherename='spfile';
IFspfileValueISNOTNULLthen
EXECUTEIMMEDIATE'alter system set resource_manager_plan = '||planName||' scope=BOTH';
ENDIF;
dbms_resource_manager.switch_plan(plan_name=>?,sid=>?);
END;
SQL> show parameter resource_manager_plan
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_manager_plan string APPPLAN
例子:使用命令创建资源计划
SQL> exec dbms_resource_manager.clear_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.create_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.create_plan(plan=>'APPPLAN2',comment=>'APPLICATION RESOURCE PLAN2');
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.create_plan_directive(plan=>'APPPLAN2',group_or_subplan=>'APPUSER',mgmt_p1=>80,comment=>'');
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.create_plan_directive(plan=>'APPPLAN2',group_or_subplan=>'OTHER_GROUPS',mgmt_p1=>10,comment=>'');
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.validate_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.submit_pending_area();
PL/SQL procedure successfully completed.
SQL> alter system set resource_manager_plan='APPPLAN2' scope=both;
System altered.
SQL> show parameter resource_manager_plan
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_manager_plan string APPPLAN2
7、指定资源计划指令
如果不使用EM创建资源计划或者资源使用者组,则必须先创建一个pending area,这是一个在资源计划或者资源使用者组激活前用来执行修改并进行验证的工作区域。
在EM可以使用如下属性页面指定计划指令:
(1)在“一般信息”页面,关联使用者组和计划,使用MGMT_MTH值指定使用者组或者子计划使用的CPU百分比。
(2)为此使用者组发出的任何操作的并行度指定限制, 为此使用者者组中的所有会话可使用的并行服务器总数指定限制, 并且指定并行语句可以位于队列中的最长时间。
(3)指定对使用者组中同时处于活动状态的最大会话数的限制。其他所有会话将在激活队列中等待。
(4)控制使用者组产生的UNDO总量。
(5)指定会话可以在使用者组中执行的持续时间或资源限制,如执行时间限制(以秒为单位)、I/O 限制(以MB 为单位)和I/O 请求限制(以请求数为单位)。如果超过任何限制, 可将该会话切换至其他使用者组, 并可取消该会话的SQL操作或终止该会话。
(6)指定会话在使用者组中可以处于空闲状态的最长时间,也可以指定阻塞其他会话时的最大空闲时间。
8、资源计划的资源分配方法
使用资源分配方法确定资源管理器如何将指定的资源分配给资源使用者组或者资源计划。创建资源计划时,需要为以下资源分配方法指定值。
使用MGMT_MTH参数指定CPU分配,有二种方式:
- EMPHASIS是单级计划的默认方法。它也用于多级计划,它以百分比形式指定CPU 如何在使用者组之间分配。
- RATIO适用于单级计划,它使用比率来指定如何分配CPU。
PARALLEL_DEGREE_LIMIT_MTH限制任何操作的最大并行度。只能为资源使用者组,而不能为子计划指定此方法。PARALLEL_DEGREE_LIMIT_ABSOLUTE方法是唯一的可能值,用于指定可以为一个操作分配的进程数量。如果有多个计划指令引用了相同的子计划或使用者组,则所有可能值中的最小值将用作该子计划或使用者组的并行度限制。
ACTIVE_SESS_POOL_MTH参数限制活动会话的数量。所有其它会话均为非活动的,在队列中等待激活。此参数的唯一值(即唯一可用的方法)是PARALLEL_DEGREE_LIMIT_ABSOLUTE,该值也是此参数的默认值。
QUEUING_MTH控制队列中非活动会话的执行顺序。FIFO_TIMEOUT是默认且唯一可用的方法。
9、对比EMPHASIS和RATIO
EMPHASIS这一CPU 分配方法确定在资源计划中对不同使用者组中的会话的重视程度。
CPU 使用率的分配级别为从1到8,级别1的优先级最高。百分比指定如何将CPU 资源分配给每一级中的各个使用者组。
以下规则适用于EMPHASIS资源分配方法:
- CPU资源在给定级别按指定的百分比分配。为资源使用者组指定的CPU百分比是该使用者组在给定级别可以使用的最大值。
- 给定级别上未使用的使用者资源可供下一级别的使用者组使用。例如,如果级别1的使用者组只使用了60%的可用资源,则其余的40%可供级别2的使用者组使用。
- 任何给定级别的百分比总和必须小于等于100。
- 对于没有明确指定计划指令的所有级别,其所有子计划或使用者组的默认资源是0%。
- EMPHASIS资源分配方法避免了资源缺乏问题,该问题导致优先级较低的使用者没有运行的机会。
RATIO策略是一种单级别的CPU分配方法。将指定要为使用者组分配的CPU比率相对应的数字,而不是百分比。
例如,假定有三个使用者组OLTP_USERS、DSS_USERS和BATCH_USERS,可以指定下列比率:
- OLTP_USERS: 4
- DSS_USERS: 3
- BATCH_USERS: 2
- OTHER: 1
这就类似于让OLTP用户获得40%的资源、DSS用户获得30%的资源、批用户获得20%的资源、所有其它使用者组获得10%的可用资源。
如果OTHER或DSS_USERS使用者组中当前都没有使用者在使用CPU资源,则OLTP_USERS使用者组将获得三分之二的可用资源,而BATCH_USERS使用者组将获得其余三分之一的可用资源。
10、活动会话池机制
使用活动会话池功能,可以控制每个资源使用者组的最大并发活动会话数。使用此功能,由于资源的消耗与活动会话的数量成比例,所以DBA 能间接控制任何资源使用者组使用的资源量。使用活动会话池有助于减少从系统中获取资源的服务器数量,因而可以避免由于试图同时运行过多作业而导致的低效的分页、交换和其它资源损耗(如内存)。
使用活动会话填充活动会话池后,资源管理器对尝试成为活动会话的所有后续会话进行排队,直到其它活动会话完成或成为不活动会话。活动会话是事务处理、查询或并行操作中当前涉及的会话。单独的并行从属进程不被视为会话;而将整个并行操作视为一个活动会话。
每个资源使用者组只有一个队列,排队方法是先进先出(FIFO),并带有超时。队列采用内存结构,不能直接查询。
11、设置活动会话池
使用EM可以方便地配置资源计划的活动会话池设置。
例如,如果将APPUSER使用者组的活动会话的最大数量限制为50:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'DEFAULT_PLAN',
group_or_subplan => 'APPUSER',
new_comment => '',
new_active_sess_pool_p1 => 50,
new_queueing_p1 => NULL,
new_parallel_degree_limit_p1 => NULL,
new_switch_group => '',
new_switch_time => NULL,
new_switch_estimate => false,
new_max_est_exec_time => NULL,
new_undo_pool => NULL,
new_max_idle_time => NULL,
new_max_idle_blocker_time => NULL,
mgmt_p1 => NULL,
mgmt_p2 => NULL,
mgmt_p3 => 60,
mgmt_p4 => NULL,
mgmt_p5 => NULL,
mgmt_p6 => NULL,
mgmt_p7 => NULL,
mgmt_p8 => NULL,
switch_io_megabytes => NULL,
switch_io_reqs => NULL,
switch_for call);
dbms_resource_manager.submit_pending_area();
END;
例子:使用命令设置会话池
SQL> exec dbms_resource_manager.clear_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.create_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.update_plan_directive(plan=>'appplan',group_or_subplan=>'appuser',new_active_sess_pool_p1=>50);
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.validate_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.submit_pending_area();
PL/SQL procedure successfully completed.
12、指定阈值
指定执行时间限制:
? 预先估计操作执行时间(通过基于成本的优化程序统计信息),默认值为:UNLIMITED
? 在资源使用者组级别指定最大估计执行时间
? 如果估计时间超过MAX_EST_EXEC_TIME:(ORA-07455),则不允许启动大工作量作业
指定其它阈值:
? 使用SWITCH_IO_MEGABYTES限制会话I/O(以MB表示)
? 使用SWITCH_IO_REQS限制会话I/O请求
使用SWITCH_FOR_CALL返回原始使用者组(默认值:FALSE,使用者组未还原)
通过设置资源计划指令的MAX_EST_EXEC_TIME参数,可以定义任何给定时间发生的任何操作的最大估计执行时间。
? 设置了此参数后,数据库资源管理器将估计特定作业消耗的时间,该时间通过基于成本的优化程序的统计信息计算得出。
? 如果有多个计划指令引用了某个资源使用者组,则该组可能会有多个MAX_EST_EXEC_TIME。数据库资源管理器将选择所有传入值中限制性最强的那个值。
? 如果操作的估计时间超过MAX_EST_EXEC_TIME,则不启动操作并发出ORA-07455错误。这样可以消除任何占用过多系统资源的异常大的作业。
? SWITCH_IO_MEGABYTES指令指定在执行某项操作之前会话可发出的I/O的量(以MB为单位)。默认值为NULL,表示无限制。
? SWITCH_IO_REQS指令指定在执行某项操作之前会话可发出的I/O请求的数量。默认值为NULL,表示无限制。
? SWITCH_FOR_CALL指令指定如果是因为SWITCH_TIME、SWITCH_IO_MEGABYTES或SWITCH_IO_REQS参数而执行某项操作,则在顶级调用结束时使用者组将还原至原始的使用者组。默认值是FALSE,表示在顶级调用结束时不还原原始的使用者组。
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan=>?,
group_or_subplan=>?,
new_comment=>?,
new_mgmt_p1=>?,new_mgmt_p2=>?,new_mgmt_p3=>?,new_mgmt_p4=>?,
new_mgmt_p5=>?,new_mgmt_p6=>?,new_mgmt_p7=>?,new_mgmt_p8=>?,
new_parallel_degree_limit_p1=>?,
new_parallel_target_percentage=>?,
new_parallel_queue_timeout=>?,
new_switch_io_reqs=>?,
new_switch_io_megabytes=>?
,
new_active_sess_pool_p1=>?,
new_queueing_p1=>?,
new_switch_group=>?,
new_switch_time=>?,
new_switch_estimate=>case?when'false'thenfalsewhen'true'thentrueelsefalseend,
new_undo_pool=>?,
new_max_idle_time=>?,
new_max_idle_blocker_time=>?,
new_switch_for_call=>case?when'false'thenfalsewhen'true'thentrueelsefalseend
);
dbms_resource_manager.update_plan_directive(
plan=>?,
group_or_subplan=>?,
new_comment=>?,
new_mgmt_p1=>?,new_mgmt_p2=>?,new_mgmt_p3=>?,new_mgmt_p4=>?,
new_mgmt_p5=>?,new_mgmt_p6=>?,new_mgmt_p7=>?,new_mgmt_p8=>?,
new_parallel_degree_limit_p1=>?,
new_parallel_target_percentage=>?,
new_parallel_queue_timeout=>?,
new_switch_io_reqs=>?,
new_switch_io_megabytes=>?
,
new_active_sess_pool_p1=>?,
new_queueing_p1=>?,
new_switch_group=>?,
new_switch_time=>?,
new_switch_estimate=>case?when'false'thenfalsewhen'true'thentrueelsefalseend,
new_undo_pool=>?,
new_max_idle_time=>?,
new_max_idle_blocker_time=>?,
new_switch_for_call=>case?when'false'thenfalsewhen'true'thentrueelsefalseend
);
dbms_resource_manager.submit_pending_area();
END;
13、指定空闲超时
使用资源计划的“Idle Time(空闲时间)”选项卡可以设置资源计划的最大空闲超时。“Max Idle Time (sec)(最长空闲时间(秒))”和“Max Idle Time if Blocking Another Session (sec)(阻塞其他会话时的最大空闲时间(秒))”分别等效于DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE过程中的NEW_MAX_IDLE_TIME和NEW_ MAX_IDLE_BLOCKER_TIME资源指令。这两项均以秒为单位。
NEW_MAX_IDLE_TIME指定会话既不处于执行状态也不处于等待I/O状态的时间。会话超过指定的时限后,PMON进程将强制终止会话并清除其状态。除了限制会话的最大空闲时间外,还可以限制空闲会话阻塞其它会话的时间。通过NEW_MAX_IDLE_BLOCKER_TIME资源指令可以设置允许某个阻塞其它会话的会话处于空闲状态的秒数,以便强制实施此限制。还可以指定UNLIMITED值,表示不设置最大时间。默认值为NULL,表示无限制。这些设置提供了比概要文件更为精细的控制。在概要文件中,单一的值无法区分阻塞会话和非阻塞会话。
在示例中,PMON进程会终止空闲时间超过600 秒的会话。PMON进程还会终止空闲时间超过300 秒并且阻塞其它会话的会话。PMON每分钟检查一次这些限制,如果发现有会话超出了其中一个限制,便强制终止该会话并清除其所有资源。
例子:使用命令设置空闲超时
SQL> exec dbms_resource_manager.clear_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.create_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.update_plan_directive(plan =>'appplan',group_or_subplan =>'appuser',new_comment => '',new_max_idle_time =>600,new_max_idle_blocker_time =>300);
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.validate_pending_area();
PL/SQL procedure successfully completed.
SQL> exec dbms_resource_manager.submit_pending_area();
PL/SQL procedure successfully completed.
14、在数据库级别限制CPU使用
数据库合并要求:
? 应用程序彼此孤立
? 性能一致
CPU 指令可用于:
? 为每个应用程序指定一个最小的CPU 分配
? 指定应该如何重新分配未使用的分配
? 指定MAX_UTILIZATION_LIMIT属性以便对CPU占用率实施绝对上限(这将覆盖计划内部的任何CPU重新分配)
? 良好的候选应用程序:自动维护任务
对于并行数据库会话:数据库合并要求应用程序彼此孤立。当一个应用程序的工作量增加时,这种增加不应影响其它应用程序。此外,每个应用程序的性能还应保持一致。
固定策略CPU资源管理
使用资源计划指令的MAX_UTILIZATION_LIMIT属性,可以对资源使用者组的CPU占用率设置绝对上限。该绝对限制会覆盖计划内部的任何CPU重新分配。
注:数据库合并的良好候选应用程序是自动维护任务,因为当前这些应用程序可占用100%的服务器CPU资源。可以为每个自动任务使用者组设置一个最大限制。
15、在数据库级别限制CPU使用
MAX_UTILIZATION_LIMIT指令可限制应用程序的CPU消耗。可以设置最小和最大边界,如图中所示。
图中的PL/SQL示例在级别1上为APP_1使用者组指定了一个CPU分配资源的最小值百分比(50%)。该示例还指定了同一使用者组允许的最大绝对CPU占用率百分比(60%)。
示例使用了DB_CONSOLIDATION_PLAN 计划。
可以为示例表中的每个使用者组执行类似命令。
注意:在11gR2之前版本中,隐式的最大占用率限制为100%。
16、在服务器级别限制CPU使用:实例限制
? 在运行多个数据库实例的多CPU服务器上管理CPU分配
? 启用实例限制功能:
– 启用任意CPU资源计划。
alter system set resource_manager_plan= 'default_plan';
– 指定实例可随时使用的CPU 的最大数目。
alter system set cpu_count=4;
两种方法:
– 超量配置:每个实例的CPU 限制的总和超过实际的CPU 数目。
– 分区:每个实例的CPU 限制的总和等于实际的CPU数目。
因为许多测试、开发和小型生产数据库无法充分利用它们所在的服务器,所以服务器合并提供了一种可能的替代方法。使用服务器合并,可以通过在服务器上运行多个数据库实例来更充分地利用资源。但是,这可能会导致CPU 争用以及由于一个实例上的工作量激增而带来的负面影响。
实例限制是使用CPU_COUNT初始化参数来限制实例可使用的CPU 数目的一种方式。此外,还可以利用资源管理器基于实例的资源计划为数据库会话分配CPU。
通过启用以下内容,分两步配置实例限制:
? 资源管理器,用于限制数据库实例消耗的CPU的量
? CPU_COUNT参数,指定数据库实例可在任意时间使用的CPU的最大量(限制),而不是实际的量
默认情况下,CPU资源管理器假定数据库实例可使用服务器上的所有CPU。要启用实例限制,任何具有CPU指令的资源计划皆可使用。
17、实例限制示例
超量配置方法:此方法适用于非关键性数据库和低负载、非关键性的生产系统。虽然实例相互影响彼此的性能,但是在任意给定的时间,都会有一个或多个实例可能处于闲置状态或者负载较低。
虽然数据库实例可相互影响彼此的性能,但是实例限制能够限制这种影响,并有助于提供可预测的性能。在左边的示例中,全部四个实例均将CPU_COUNT设置为4,数据库实例在任意时间点可占用的CPU的最大百分比为数据库实例自己的限值除以所有活动数据库的限值总和。在本示例中,一个实例将能够消耗4/(4+4+4+4)=25%的CPU。如果只有两个实例处于活动状态,则一个实例将能够消耗4/(4+4)=50% 的CPU。
分区方法:此方法适用于关键生产系统。它能够防止实例互相影响,并且提供可预测的性能。
实例限制可对CPU 资源进行分区,确保所有CPU限值的总和不超过CPU的总数。在右边的示例中,如果四个数据库实例共享一个具有16个CPU的服务器,则它们的限值可设置为8、4、2和2。通过将CPU资源专用于某个数据库实例,分区有以下两个优点:
? 一个数据库实例的CPU负载不会影响另一个数据库实例的CPU负载。
? 每个数据库实例的CPU资源是固定的,从而使性能的预测更加准确。
18、监控实例限制
查看CPU_COUNT参数的值:
SELECT value FROM v$parameter WHERE name = 'cpu_count'
AND (isdefault = 'FALSE' OR ismodified != 'FALSE');
确认资源管理器的状态:
SELECT name FROM v$rsrc_plan
WHERE is_top_plan = 'TRUE' AND cpu_managed = 'ON';
管理限制:
SELECT begin_time, consumer_group_name,
cpu_consumed_time, cpu_wait_time
FROM v$rsrcmgrmetric_history
ORDER BY begin_time;
SELECT name, consumed_cpu_time, cpu_wait_time
FROM v$rsrc_consumer_group;
? 如果未设置CPU_COUNT参数,第一个查询不会返回任何值。
? 如果第二个查询未返回任何行,表明资源管理器未管理CPU。如果返回了行,则表明存在活动的计划。
实例限制通过限制前台进程来限制前台进程的CPU消耗。当前台进程在“resmgr:cpu quantum”等待事件中等待时,将限制该前台进程。
可以通过两种方法监视限制的量:
? V$RSRCMGRMETRIC_HISTORY视图显示过去一小时中每一分钟CPU的消耗量(CPU_CONSUMED_TIME) 和限制量(CPU_WAIT_TIME)。值以毫秒为单位进行显示。
? V$RSRC_CONSUMER_GROUP视图显示自CPU资源管理启用以来CPU 的消耗量(CPU_CONSUMED_TIME) 和限制量(CPU_WAIT_TIME)。时间以毫秒为单位进行显示。
19、资源使用者组映射
通过提供会话属性和使用者组之间的映射,可以将数据库资源管理器配置为自动将使用者组分配到会话。此外,还可以指定映射的优先级,从而指示在冲突时优先使用哪个映射。有两种类型的会话属性:登录属性和运行时属性。登录属性(图中所示的“Attribute Mappings(属性映射)”列表中的最后五项)只在会话登录时有意义,此时数据库资源管理器将确定会话的初始使用者组。而会话登录后可以根据其运行时属性分配到其它使用者组。
在Database Control 主页中,导航到“Server(服务器)”选项卡页,然后单击“Resource Manager(资源管理器)”部分中的“Resource Consumer Group Mappings(资源使用者组
映射)”链接。对于每个属性,设置由标识会话的方法(如用户名)和使用者组所组成的映射。根据需要,添加或删除每个资源使用者组类别所对应的行,并在相应组中输入用于标识用户、客户机、模块或服务的文本。使用“Priorities(优先级)”选项卡,可以建立冲突的属性映射之间的优先级顺序。使用导航箭头(幻灯片中突出显示)可以按重要性从高到低的顺序设置优先级。列表顶部的映射优先级最高。
使用EM Database Control,可以单击“Show SQL(显示SQL)”按钮,方便地查看操作生成的SQL。
以下示例为客户机OS 用户授予了比客户机程序更高的优先级:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.set_consumer_group_mapping(
dbms_resource_manager.oracle_user,
'SCOTT',
'LOW_GROUP'
);
dbms_resource_manager.set_consumer_group_mapping_pri(
EXPLICIT => 1, SERVICE_MODULE_ACTION => 2,
SERVICE_MODULE => 3,
MODULE_NAME_ACTION => 4,
MODULE_NAME => 5,
SERVICE_NAME => 6,
ORACLE_USER => 7,
CLIENT_OS_USER => 8,
CLIENT_PROGRAM => 9,
CLIENT_MACHINE => 10
);
dbms_resource_manager.submit_pending_area();
END;
20、激活资源计划
使用Oracle Enterprise Manager的“Plans(计划)”页可以管理资源计划。要激活计划,请选择所要激活的计划,在“Actions(操作)”下拉列表中选择“Activate(激活)”,然后单击“Go(执行)”。选定的计划将成为实例的当前最高计划。
使用RESOURCE_MANAGER_PLAN初始化参数
实例的计划是使用RESOURCE_MANAGER_PLAN数据库初始化参数定义的。此参数指定用于此实例的最高计划。如果没有指定计划,则不为实例激活资源管理器。
使用ALTER SYSTEM语句可以激活、停用或更改当前最高计划。使用此命令更改资源计划时,更改将立即生效。
如果在参数文件中设置了参数,并且未在数据库中定义指定的计划,则不能使用该参数文件打开数据库。此时将返回以下错误:
ORA-07452: specified resource manager plan does not exist in the data dictionary
如果遇到此错误,则必须先修改参数以显示正确值,然后才能重新启动实例。
21、数据库资源管理器信息
若干数据字典视图可用于检查实例中声明的资源计划、使用者组和计划指令。本节讨论了可以从这些视图中获取的一些有用信息。
使用下列查询可获取有关数据库中定义的资源计划的信息:
SQL> SELECT plan, num_plan_directives, status, mandatory
2 FROM dba_rsrc_plans;
PLAN NUM_PLAN_DIRECTIVES STATUS MAN
-------------- ------------------- --------- ---
DEFAULT_PLAN 3 ACTIVE NO
INTERNAL_QUIESCE 2 ACTIVE YES
INTERNAL_PLAN 1 ACTIVE YES
BUGDB_PLAN 4 ACTIVE NO
MAILDB_PLAN 3 ACTIVE NO
MYDB_PLAN 3 ACTIVE NO
ACTIVE状态表示计划已经提交并且可供使用,而PENDING状态表示计划已经创建,但仍在暂挂区。(11gR2中只有pending和null)
如果为mandatory列为YES值,则不能删除计划。
22、监控资源管理器
可以在会话级别监视数据库资源管理器的运行。此功能已集成在自动数据库诊断监视程序(ADDM) 中。
使用EM Database Control可以用不同的方法来管理和监视资源管理器。在“Server(服务器)”选项卡页上,单击“Resource Manager(资源管理器)”部分中的“Statistics(统计信息)”链接。
“Resource Monitors Statistics(资源监视器统计信息)”页显示一组描述活动资源计划当前状态的统计信息和图表。您可以查看当前活动计划的统计信息。
对于资源使用率,可以查看“消耗的CPU”、“每秒I/O请求”和“每秒发出的I/O MB”。
另一图表显示“资源管理器导致等待”。还有“Queued Sessions(排队的会话)”、“Automatic Reprioritization(自动重设优先级)”以及空闲时间的统计信息。
23、监控资源管理器
? V$SESSION:包含显示会话的当前组的resource_consumer_group列
? V$RSRC_PLAN:显示活动资源计划的视图
? V$RSRC_CONSUMER_GROUP:包含所有活动组统计信息的视图
CPU 使用率
可以提供有关Oracle数据库CPU占用率信息的视图至少有以下三种:
? 如果运行的是Oracle数据库资源管理器,V$RSRC_CONSUMER_GROUP可以基于每个使用者组显示CPU占用率的统计信息。此视图显示与当前活动的资源使用者组相关的数据。
? V$SYSSTAT显示所有会话的Oracle数据库CPU使用率。“CPU used by this session(此会话使用的CPU)”统计信息显示所有会话使用的CPU总计。
? V$SESSTAT显示每个会话的Oracle数据库CPU使用率。可以使用此视图确定占用CPU最多的特定会话。
V$RSRC_CONSUMER_GROUP视图
下面简要描述了此视图中的部分列:
? name:使用者组的名称。
? active_sessions:此使用者组中的当前活动会话数。
? execution_waiters:等待时间片断的活动会话数。
? requests:此使用者组中累计执行的请求数。
? cpu_wait_time:会话等待CPU 的累计时间。
? consumed_cpu_time:所有会话累计消耗的CPU 时间。
没有任何视图可以直接显示活动会话池队列,但是可以通过以下对象获取一些信息:
? V$SESSION:current_queue_duration列显示会话的排队时间,如果会话当前没有排队,则显示0(零)。
? V$RSRC_CONSUMER_GROUP:queue_length列显示每个使用者组中当前排队的会话数。
参考:http://blog.csdn.net/rlhua/article/details/13092965
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28536251/viewspace-2137192/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28536251/viewspace-2137192/