在数据库中限制某个用户的CPU使用率

虽然知道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%。

 

posted @   石云华  阅读(363)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示