본문 바로가기

빅데이터과정/WORKSHOP 2

#31_140725_WSHOP2_RESOURCE MANAGER

728x90
# RESOURCE MANAGER




Resource manager?

특정 세션이 오라클 서버의 리소스를 과도하게 사용하지 못하도록 제한을 거는 기능

Resource manager 기능을 사용하기 위해서 설정해야할 내용

resource consumer group : 리소스를 사용하고 있는 그룹
resource plan : daytimeplan, nighttimeplan을 만듦
daytimeplan - cpu 할당방식을 정한다
: oltp 80% cpu 사용
: batch 20% cpu 사용











Resource Manager 로 제한할 수 있는 리소스의 종류

CPU 사용량
병렬도 : 병렬작업할 수 있는 수
/*+ parallel(emp,20) */
활성 세션 수 : waiting 하고 있는 세션의 갯수
언두 생성
: rollback 할 수도 있기 때문에 undo에 넣어둔다대규모 데이터를 delete 시키면 다른 유저들이 작업을 못한다
: delete from sales;
작업 실행 시간 
idel 시간 특정 시간동안 아무것도 안하면 접속이 끊어진다





Resource Manager 테스트

a) SYSTEM user로 접속하여 consumer group ONLINE_USERS 를 생성한다

SQL> conn system/oracle
SQL> exec dbms_resource_manager.create_pending_area();
Resource Manager를 설정
SQL> exec dbms_resource_manager.create_consumer_group('ONLINE_USERS','Users for Online');
컨서머 그룹을 생성

b) resource plan DAYTIME 을 다음과 같이 생성한 후 view를 통해 확인한다.
    A. SYS_GROUP    : CPU_P1=100
    B. ONLINE_USERS : CPU_P2=70, MAX_IDEL_BLOCKER_TIME=30
    C. OTHER_GROUPS : CPU_P2=30, PARALLEL_DEGREE_P1=4

SQL> begin
 dbms_resource_manager.create_plan('DAYTIME','Plan for day');
end;
/
DAYTIME 이라는 리소스 플랜 생성

SQL> begin
 dbms_resource_manager.create_plan_directive('DAYTIME', 'SYS_GROUP','1st Group Set',    cpu_p1=>100);
     end;
/
SYS 유저는 cpu를 100% 사용할 수 있도록 지시어 생성
SYS 유저는 가장 우선순위를 높게 만듦

SQL> begin
dbms_resource_manager.create_plan_directive('DAYTIME', 'ONLINE_USERS','2nd Group set',
cpu_p2=>70,max_idle_blocker_time=>30);
    end;
/
online_users 그룹은 cpu 70%만 사용할 수 있도록 지시어 생성
max_idle_blocker_time=>30 : 30초 후에 홀더를 자동으로 kill

SQL> begin
 dbms_resource_manager.create_plan_directive('DAYTIME', 'OTHER_GROUPS','3rd Group',
cpu_p2=>30,parallel_degree_limit_p1=>4);
     end;
/
other 그룹은 cpu를 30% 사용할 수 있도록 지시어 생성

SQL> exec dbms_resource_manager.validate_pending_area();
설정한 리로스 매니저 성정이 유효할지 확인

SQL> exec dbms_resource_manager.submit_pending_area();
설정한 리소스 매니저 기능을 구현

SQL> select plan, group_or_subplan, cpu_p1, cpu_p2,  
            parallel_degree_limit_p1 dop, max_idle_blocker_time block_t
     from dba_rsrc_plan_directives
     order by 1,2
    /


c) HR user consumer group ONLINE_USERS로 지정하고 default consumer 
group으로 지정한다.

SQL> exec dbms_resource_manager_privs.grant_switch_consumer_group('HR', 'ONLINE_USERS', true);
online users 그룹에 HR 등록

SQL> exec dbms_resource_manager.set_initial_consumer_group('HR', 'ONLINE_USERS');
online users 그룹에 HR 등록

SQL> select * from dba_rsrc_consumer_group_privs;
GRANTEE                        GRANTED_GROUP                  GRA INI
------------------------------ ------------------------------ --- ---
PUBLIC                         DEFAULT_CONSUMER_GROUP         YES YES
SYSTEM                         SYS_GROUP                      NO  YES
HR                             ONLINE_USERS                   NO  YES
PUBLIC                         LOW_GROUP                      NO  NO

e) 현재 instance에만 resource plan DAYTIME을 활성화 시키시오.

SQL> alter system set resource_manager_plan=daytime scope=memory;
메모리에 바로 적용하겠다

5. 활성화된 Resource Plan에 대한 사용자에 대한 테스트를 수행한다.
a) 새로운 HR session 2개를 생성한다.  이때 SYSTEM user session 에서 V$SESSION 를 조회하여 HR user 2개의 세션에 대한 consumer group 를 확인한다.

SQL> conn system/oracle

SQL> select sid, serial#, blocking_session,resource_consumer_group 
          from v$session
           where username = 'HR';

# HR 1st Session

$  sqlplus hr/hr

# HR 2nd Session

$  sqlplus hr/hr

# SYSTEM Session

SQL> select sid, serial#, blocking_session,resource_consumer_group
         from v$session
        where username = 'HR';
       SID    SERIAL# BLOCKING_SESSION RESOURCE_CONSUMER_GROUP
---------- ---------- ---------------- --------------------------------
       136       4996                  ONLINE_USERS
       145        610                  ONLINE_USERS

a)           HR 1st Session 에서 다음의 update문을 수행한다

Update employees set salary = 30000 where department_id = 20;

b)          HR 2nd Session에서 다음의 update 문을 수행한다.

Update employees set salary = 2000 where department_id in ( 10,20);
똑 같은 부서번호 20번으로 업데이트를 시키기 때문에 waiting 한다
waiting 하다가 30초 후에 kill 된다

c)           HR 1st session으로 인한 blocking time 30초가 넘으면 HR 1st Session은 자동으로 종료되고 HR 2nd Session이 정상적으로 update가 수행되었음을 확인할 수 있다.  다음의 쿼리문을 조회하여 결과를 확인한다.

select name, ACTIVE_SESSIONS, IDLE_BLKR_SESSIONS_KILLED from  v$RSRC_CONSUMER_GROUP;

# HR 1st Session

SQL> Update employees set salary = 30000 where department_id = 20;

# HR 2nd Session

SQL> Update employees set salary = 2000 where department_id in ( 10,20);
WAITING (잠시 기다리면 세션이 정상적으로 update되었음을 확인할 수 있다.

# SYSTEM Session

SQL> select name, ACTIVE_SESSIONS, IDLE_BLKR_SESSIONS_KILLED from  v$RSRC_CONSUMER_GROUP;
NAME                             ACTIVE_SESSIONS IDLE_BLKR_SESSIONS_KILLED
-------------------------------- --------------- -------------------------
SYS_GROUP                                      1                         0
ONLINE_USERS                                   1                         1
OTHER_GROUPS                                   0                         0

e) HR 1st Session이 정상적으로 Killed되었음을 확인하고 HR 2nd Session rollback하고 세션들을 정리한다.
# HR 1st Session

SQL> Update employees set salary = 30000 where department_id = 20;

SQL> select * from tab;

ERROR at line 1:
ORA-02396: exceeded maximum idle time, please connect again

SQL> exit;

# HR 2nd Session

SQL> Update employees set salary = 2000 where department_id in ( 10,20);

SQL> rollback;

SQL> exit;




'빅데이터과정 > WORKSHOP 2 ' 카테고리의 다른 글

#35_140801_TUNING_SUBQUERY TUNING  (0) 2014.08.01
#31_140725_WSHOP2_SCHEDULER  (0) 2014.07.25
#31_140725_WSHOP2_RESUMABLE SPACE ALLOCATION  (0) 2014.07.25
#31_140725_WSHOP2_DB REORG  (0) 2014.07.25
#31_140725_WSHOP2_DATABASE REPLAY  (0) 2014.07.25