1. 程式人生 > 資料庫 >在資料庫中限制某個使用者的CPU使用率

在資料庫中限制某個使用者的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%。