‘Resmgr:Cpu Quantum’是resource manager用来控制分配CPU给processes的标准事件,当sessions无论什么原因使用了大量的CPU的时候,你有可能会看到一个‘hang’住的场景。这个事件发生在resource manager被启用,并用来节省CPU消耗的时候,但在11g中你即便已经禁用了resource manager,你仍旧会发现有高的‘Resmgr:Cpu Quantum’等待事件出现,亦或者出现‘sqlplus / as sysdba’被hang在那里的情况,你确定了参数‘RESOURCE_MANAGER_PLAN’是被设置为空的,但你依旧会看到高的‘Resmgr:Cpu Quantum’等待事件占据Top 5 Event:
Top 5 Timed Foreground Events:
Event Waits Time(s) Avg wait(ms) % DB time Wait Class
------------------------ ------- -------- ------------ -------------- ---------- -----------
resmgr:cpu quantum 1,596 346,281 216968 89.19 Scheduler
db file scattered read 171,071 14,778 86 3.81 User I/O
log file sync 28,575 10,810 378 2.78 Commit
db file sequential read 943,457 6,569 7 1.69 User I/O
DB CPU 2,133 0.55
这是由于从11g开始每个weekday window有一个预定义的Resource Plan叫做DEFAULT_MAINTENANCE_PLAN,当相关的window被打开的时候它就会被激活。
当它被激活的时候你会在alert log里看到以下条目信息:
Thu Sep 26 02:00:00 2013
Clearing Resource Manager plan via parameter
:
Thu Sep 26 22:00:00 2013
Setting Resource Manager plan SCHEDULER[0x2C55]:DEFAULT_MAINTENANCE_PLAN via scheduler window
Setting Resource Manager plan DEFAULT_MAINTENANCE_PLAN via parameter
Thu Sep 26 22:00:05 2013
Begin automatic SQL Tuning Advisor run for special tuning task "SYS_AUTO_SQL_TUNING_TASK"
解决办法:
较好的解决办法是将维护窗口移动到一个较空闲的时候,能有足够有效的CPU资源去运行和完成这个任务。
禁用DEFAULT_MAINTENANCE_PLAN应该只能作为最后的选项来解决这个问题,因为如果Oracle没有足够的维护窗口去收集新的优化器状态、为昂贵的SQL找到更好的执行计划、清空AWR等的话,这种做法可能导致在长期运行中的一些其他问题。
1. 设置当前的resource manager plan为空
alter system set resource_manager_plan='' scope=both;
2. 改变激活的window为使用空的resource manager plan
execute dbms_scheduler.set_attribute('WEEKNIGHT_WINDOW','RESOURCE_PLAN','');
execute dbms_scheduler.set_attribute('WEEKEND_WINDOW','RESOURCE_PLAN','');
11g开始有更多的维护窗口,同样需要修改它们
execute dbms_scheduler.set_attribute('SATURDAY_WINDOW','RESOURCE_PLAN','');
execute dbms_scheduler.set_attribute('SUNDAY_WINDOW','RESOURCE_PLAN','');
execute dbms_scheduler.set_attribute('MONDAY_WINDOW','RESOURCE_PLAN','');
execute dbms_scheduler.set_attribute('TUESDAY_WINDOW','RESOURCE_PLAN','');
execute dbms_scheduler.set_attribute('WEDNESDAY_WINDOW','RESOURCE_PLAN','');
execute dbms_scheduler.set_attribute('THURSDAY_WINDOW','RESOURCE_PLAN','');
execute dbms_scheduler.set_attribute('FRIDAY_WINDOW','RESOURCE_PLAN','');
3. 对其他的自定义的window也同样设置
execute dbms_scheduler.set_attribute('<window name>','RESOURCE_PLAN','');