虽然知道dbms_resource_manager可以限制CPU的使用率,但也一直未真正使用过。今天有个需求,需要限制数据库某一个或几个用户的CPU最大使用率,于是有了如下测试。
1. 在数据库中创建MAINTENANCE资源消费组
begin
dbms_resource_manager.create_pending_area();
dbms_resource_manager.create_consumer_group(
consumer_group=>'MAINTENANCE'
);
dbms_resource_manager.submit_pending_area();
end;
/
2. 在数据库中创建消费者与资源消费组的映射规则。
----也即将数据库用户test 加入到MAINTENANCE消费组
begin
dbms_resource_manager.create_pending_area();
-- Map 'TEST' user to MAINTENANCE group
dbms_resource_manager.set_consumer_group_mapping(
attribute=>'ORACLE_USER',
value=>'TEST',
consumer_group=>'MAINTENANCE');
dbms_resource_manager.submit_pending_area();
end;
/
3. 为数据库用户授权,允许访问资源消费者组。
begin
dbms_resource_manager.create_pending_area();
dbms_resource_manager_privs.grant_switch_consumer_group(
grantee_name=>'PUBLIC',
consumer_group=>'MAINTENANCE',
grant_option=>FALSE);
dbms_resource_manager.submit_pending_area();
end;
/
4. 设置消费组映射优先级。
begin
dbms_resource_manager.create_pending_area();
dbms_resource_manager.set_consumer_group_mapping_pri(
explicit => 1,
oracle_user => 2,
client_program => 3,
service_module_action => 4,
service_module => 5,
module_name_action => 6,
module_name => 7,
service_name => 8,
client_os_user => 9,
client_machine => 10 );
dbms_resource_manager.submit_pending_area();
end;
/
5. 创建数据库资源分配计划
---也即MAINTENANCE消费组中的用户最多只允许使用10%的CPU资源
begin
dbms_resource_manager.create_pending_area();
-- Create Resource Plan
dbms_resource_manager.create_plan(
plan=>'MYPLAN',
comment=>'Plan for data warehouse');
dbms_resource_manager.create_plan_directive(
plan=>'MYPLAN',
group_or_subplan=>'MAINTENANCE',
comment=>'allocation for MAINTENANCE',
max_utilization_limit=>10);
dbms_resource_manager.create_plan_directive(
plan=> 'MYPLAN',
group_or_subplan=> 'other_groups',
comment=> 'this group is mandatory',
max_utilization_limit => 90);
dbms_resource_manager.submit_pending_area();
end;
/
6. 资源计划生效
alter system set resource_manager_plan='MYPLAN' sid='*';
alter system set resource_limit = true;
7. 压力测试脚本进行验证:
declare
i number;
j number;
begin
i := 0;
loop
j := sqrt(i);
i := i + 1;
end loop;
end;
/
8. 测试结果如图所示:
一共开启了4个会话分别执行压力测试脚本。 第2,3,4这三个进程是用test用户连接的数据库,所以CPU的使用率基本上在10%左右,而第1个进程是用其他用户连接的数据库,所以它的CPU使用率基本上是100%。