Zarządzanie zasobami w Oracle 11G
Na początku najważniejsza informacja: mechanizm zarządzania zasobami dostępny jest wyłącznie w Oracle 11G Enterprise Edition (EE). Jeśli nie masz tej edycji nie musisz już dalej czytać :). Ja zanim to sprawdziłem przestudiowałem całą dokumentację pt: „Using the Database Resource Manager”. Poniżej skrót wiadomości na ten temat. Jeśli coś źle napisałem powiadomcie mnie o tym.
Database Resource Manager – dostarcza narzędzia które pozwalają na zarządzanie zasobami procesora/procesorów w stosunku do grup użytkowników i aplikacji.
Podstawowe pojęcia:
- Resource Consumer Groups – grupa konsumentów jest zbiorem użytkowników o podobnych wymagań dotyczących zużycia zasobów. Użytkownicy mogą być przypisani do więcej niż jednej grupy zasobów konsumentów, ale każda aktywna sesja użytkownika może być przypisana tylko do jednej grupy zasobów konsumentów w danym czasie.
- Resource Plans – planu zasobów opisuje środki jakie będą przeznaczone na jedną lub więcej grup zasobów konsumentów. Na przykład mogę podać max procent wykorzystania procesora dopuszczalny dla danej grupy użytkowników.
- Resource Plan Directives – Dyrektywy określające jakie grupy konsumentów z jakich planów zasobów mają korzystać. Czyli to takie jak by powiązanie Resource Consumer Groups z Resource Plans
Do administracji planami zasobów służy pakiet DBMS_RESOURCE_MANAGER
Każda zmiana w zarządzaniu zasobami powinna być skompilowana i zrewalidowana przed jej zastosowaniem. Poniższy kod przedstawia procedurę którą należy się kierować robiąc jakieś zmiany:
BEGIN
DBMS_RESOURCE_MANAGER.clear_pending_area;
DBMS_RESOURCE_MANAGER.create_pending_area;
- Zrób coś
DBMS_RESOURCE_MANAGER.validate_pending_area;
DBMS_RESOURCE_MANAGER.submit_pending_area;
END;
/
Zakładanie grup konsumenckich (Resource Consumer Groups):
BEGIN
DBMS_RESOURCE_MANAGER.clear_pending_area;
DBMS_RESOURCE_MANAGER.create_pending_area;
-- Create the consumer groups
DBMS_RESOURCE_MANAGER.create_consumer_group(
consumer_group => 'programisci',
comment => 'Nasi kochani programisci.');
DBMS_RESOURCE_MANAGER.create_consumer_group(
consumer_group => 'batch_consumer_group',
comment => 'Batch process consumer group.');
DBMS_RESOURCE_MANAGER.validate_pending_area;
DBMS_RESOURCE_MANAGER.submit_pending_area;
END;
/
Sprawdzanie grup:
select
consumer_group,
comments
from
dba_rsrc_consumer_groups
order by
consumer_group
Kasowanie grup:
BEGIN
DBMS_RESOURCE_MANAGER.clear_pending_area();
DBMS_RESOURCE_MANAGER.create_pending_area();
-- Delete consumer groups.
DBMS_RESOURCE_MANAGER.delete_consumer_group (
consumer_group => 'programisci');
DBMS_RESOURCE_MANAGER.validate_pending_area;
DBMS_RESOURCE_MANAGER.submit_pending_area();
END;
/
Plany zarządzania zasobami tworzymy za pomocą procedury create_plan, a następnie „łączymy je” z grupami konsumenckimi za pomocą procedury create_plan_directive.
Procedury te wyglądają następująco:
PROCEDURE create_plan (
plan IN VARCHAR2,
comment IN VARCHAR2,
cpu_mth IN VARCHAR2 DEFAULT 'EMPHASIS',
active_sess_pool_mth IN VARCHAR2 DEFAULT 'ACTIVE_SESS_POOL_ABSOLUTE',
parallel_degree_limit_mth IN VARCHAR2 DEFAULT 'PARALLEL_DEGREE_LIMIT_ABSOLUTE',
queueing_mth IN VARCHAR2 DEFAULT 'FIFO_TIMEOUT')
PROCEDURE create_plan_directive (
plan IN VARCHAR2,
group_or_subplan IN VARCHAR2,
comment IN VARCHAR2,
cpu_p1 IN NUMBER DEFAULT NULL,
cpu_p2 IN NUMBER DEFAULT NULL,
cpu_p3 IN NUMBER DEFAULT NULL,
cpu_p4 IN NUMBER DEFAULT NULL,
cpu_p5 IN NUMBER DEFAULT NULL,
cpu_p6 IN NUMBER DEFAULT NULL,
cpu_p7 IN NUMBER DEFAULT NULL,
cpu_p8 IN NUMBER DEFAULT NULL,
active_sess_pool_p1 IN NUMBER DEFAULT NULL,
queueing_p1 IN NUMBER DEFAULT NULL,
parallel_degree_limit_p1 IN NUMBER DEFAULT NULL,
switch_group IN VARCHAR2 DEFAULT NULL,
switch_time IN NUMBER DEFAULT NULL,
switch_estimate IN BOOLEAN DEFAULT FALSE,
max_est_exec_time IN NUMBER DEFAULT NULL,
undo_pool IN NUMBER DEFAULT NULL,
max_idle_time IN NUMBER DEFAULT NULL,
max_idle_blocker_time IN NUMBER DEFAULT NULL,
switch_time_in_call IN NUMBER DEFAULT NULL)
Przykładowy resources plan:
BEGIN
DBMS_RESOURCE_MANAGER.clear_pending_area;
DBMS_RESOURCE_MANAGER.create_pending_area;
-- Create a new plan
DBMS_RESOURCE_MANAGER.create_plan(
plan => 'day_plan',
comment => 'Plan suitable for daytime processing.');
-- Assign consumer groups to plan and define priorities
DBMS_RESOURCE_MANAGER.create_plan_directive (
plan => 'day_plan',
group_or_subplan => 'oltp_consumer_group',
comment => 'Give OLTP processes higher priority - level 1',
cpu_p1 => 80,
switch_group => 'batch_consumer_group',
switch_time => 60);
DBMS_RESOURCE_MANAGER.create_plan_directive (
plan => 'day_plan',
group_or_subplan => 'batch_consumer_group',
comment => 'Give batch processes lower priority - level 2',
cpu_p2 => 100);
DBMS_RESOURCE_MANAGER.create_plan_directive(
plan => 'day_plan',
group_or_subplan => 'OTHER_GROUPS',
comment => 'all other users - level 3',
cpu_p3 => 100);
DBMS_RESOURCE_MANAGER.validate_pending_area;
DBMS_RESOURCE_MANAGER.submit_pending_area;
END;
/
Sprawdzanie planów:
select
plan,
group_or_subplan,
status
from
dba_rsrc_plan_directives
order by
plan,
group_or_subplan;
Mapowanie użytkowników do grup:
Zasady mapowania użytkowników do grup tworzymy za pomocą procedury SET_CONSUMER_GROUP_MAPPING (kiedyś robiło się to za pomocą SET_INITIAL_CONSUMER_GROUP) która wygląda następująco:
Parameter | Description |
---|---|
ATTRIBUTE |
The login or runtime session attribute type |
VALUE |
The value of the attribute being mapped |
CONSUMER_GROUP |
The consumer group to map to. |
Przykład:
BEGIN
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING
(DBMS_RESOURCE_MANAGER.ORACLE_USER, 'scott', 'programisci');
END;
W przypadku gdyby wystąpiły jakieś konflikty podczas mapowania, można ustawić priorytety dla poszczególnych atrybutów. Ustawiamy je za pomocą procedury SET_CONSUMER_GROUP_MAPPING_PRI:
BEGIN
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING_PRI(
EXPLICIT => 1,
SERVICE_MODULE_ACTION => 2,
SERVICE_MODULE => 3,
MODULE_NAME_ACTION => 4,
MODULE_NAME => 5,
SERVICE_NAME => 6,
ORACLE_USER => 7,
CLIENT_PROGRAM => 8,
CLIENT_OS_USER => 9,
CLIENT_MACHINE => 10
);
END;
Włączanie planów zarządzania zasobami:
Do włączania planów służy parametr inicjalizacyjny RESOURCE_MANAGER_PLAN:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'day_plan';
Wyłączanie:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
Istnieje także coś takiego jak single-level resource plan. Jest to najprostszy plan jednopoziomowy. Do jego stworzenia wykorzystujemy procedurę CREATE_SIMPLE_PLAN np:
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_SIMPLE_PLAN(SIMPLE_PLAN => 'simple_plan1',
CONSUMER_GROUP1 => 'mygroup1', GROUP1_CPU => 80,
CONSUMER_GROUP2 => 'mygroup2', GROUP2_CPU => 20);
END;
Przydatna dokumentacja: