在数据库中限制某个用户的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%。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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上本地化部署