본문 바로가기

빅데이터과정/RAC

#45_140814_RAC_GC EVENT

728x90


# GC EVENT





 

대기 이벤트들을 class로 묶어 놓은 리스트 확인방법


SQL#1> select distinct wait_class from v$event_name;

WAIT_CLASS

----------------------------------------------------------------

Concurrency

System I/O

User I/O

Administrative

Other

Configuration

Scheduler

Cluster      ->  RAC 관련 대기이벤트들의 클리스

Application

Idle

Network

Commit

 

 

 



buffer busy wait 대기 이벤트가 어느 클래스인지 확인


SQL#1> select name, wait_class from v$event_name

where name='buffer busy waits';

NAME             WAIT_CLASS

--------------------------------------------

buffer busy waits   Concurrency

 

 

 

 


 

GC(global cache) : 내 노드에 데이터가 없기 때문에 다른 node에서 데이터를 요청하고 있다고 생각하면 된다

current(update) : update를 위해 대기한다는 의미

cr(select) : select를 위해 대기한다는 의미

block 2-way : 2개의 노드간의 데이터 전송이 이루어졌다는 것을 알 수 있다

조회 : select * from v$session_event;

 

 

 



gc 관련 이벤트 확인


# 1번노드

SQL#1> exec dbms_workload_repository.create_snapshot;

SQL#1> @exec

buffer busy waits 발생

 

# 2번노드

SQL#2> @exec

buffer busy waits 발생

 

 



 

SQL#1> exec dbms_workload_repository.create_snapshot;

SQL#1> @?/rdbms/admin/awrrpt.sql

 


 

 

 

 

 

 





 

GC 이벤트 발생 원인 해결방법

 


 



reverse index

인덱스의 key 컬럼을 뒤집어서 정렬하는 인덱스


SQL> connect scott/tiger

SQL> create index emp_ename on emp(ename);

SQL> select /*+ index_asc(emp emp_ename) */ ename

      from emp

      where ename > '   ';

ENAME

----------

ADAMS

ALLEN

BLAKE

CLARK

FORD

JAMES

JONES

KING

MARTIN

MILLER

SCOTT

SMITH

TURNER

WARD

 

 

SQL> drop index emp_ename;

SQL> create index emp_ename on emp(ename) reverse;

SQL> select /*+ index_asc(emp emp_ename) */ ename

      from emp

      where ename > '   ';

ENAME

----------

WARD

FORD

BLAKE

KING

SMITH

CLARK

ALLEN

MARTIN

MILLER

TURNER

JAMES

JONES

ADAMS

SCOTT

reverse는 맨 끝자리의 알파벳 순서로 정렬

reverse를 쓰면 좋은 점은 만약에 A로 시작하는 사원이름들이 한블럭에 있는데 많은 사용자가 A로 시작하는 사원만 업데이를 한다면 gc 이벤트가 발생한다

이것을 방지하기 위해서 여러 block에 퍼뜨려서 저장할 필요가 있는데 이럴 때 reverse를 사용한다

 

 

 

 

 



 

index script 생성

 

DBA >> describe db object 메뉴 선택

 

 


 

 

 

 




 

gc current request 대기 이벤트 테스트(ADDM report)


# 1번노드

SQL#1> exec dbms_workload_repository.create_snapshot;

SQL#1> @exec


 

SQL#1> exec dbms_workload_repository.create_snapshot;

SQL#1> @?/rdbms/admin/addmrpt.sql

 

RECOMMENDATION 1: SQL Tuning, 49% benefit (584 seconds)

      ACTION: Run SQL Tuning Advisor on the SQL statement with SQL_ID

         "4wdvayfap6ddj".

         RELEVANT OBJECT: SQL statement with SQL_ID 4wdvayfap6ddj and

         PLAN_HASH 3894479442

         INSERT INTO T_GC_CURRENT_REQUEST

         VALUES(SEQ_GC_CURRENT_REQUEST.NEXTVAL, 'NAME'||:B1 )

      ACTION: Investigate the SQL statement with SQL_ID "4wdvayfap6ddj" for

         possible performance improvements.

         RELEVANT OBJECT: SQL statement with SQL_ID 4wdvayfap6ddj and

         PLAN_HASH 3894479442

         INSERT INTO T_GC_CURRENT_REQUEST

         VALUES(SEQ_GC_CURRENT_REQUEST.NEXTVAL, 'NAME'||:B1 )

      RATIONALE: SQL statement with SQL_ID "4wdvayfap6ddj" was executed 76900

         times and had an average elapsed time of 0.0075 seconds.

SQL 튜닝하라고 추천하고 있는 것을 알 수 있다

…………………………………

FINDING 6: 8.7% impact (103 seconds)

------------------------------------

A hot data block with concurrent read and write activity was found. The block

belongs to segment "OWI.IDX_GC_CURRENT_REQUEST" and is block 10580 in file 7.

 

   RECOMMENDATION 1: Application Analysis, 8.7% benefit (103 seconds)

      ACTION: Investigate application logic to find the cause of high

         concurrent read and write activity to the data present in this block.

         RELEVANT OBJECT: database block with object# 11991, file# 7 and

         block# 10580

 

   SYMPTOMS THAT LED TO THE FINDING:

      SYMPTOM: Wait class "Concurrency" was consuming significant database

               time. (15% impact [183 seconds])

      SYMPTOM: Inter-instance messaging was consuming significant database

               time on this instance. (13% impact [160 seconds])

         SYMPTOM: Wait class "Cluster" was consuming significant database

                  time. (24% impact [285 seconds])

OWI.IDX_GC_CURRENT_REQUEST 에 관한 index에 관해서 말하고 있다

 

 

 

ORANGE를 통해서 index script 추출

아래의 인덱스 부분만 가져와서 reverse로 만들면 index 관련 이벤트를 줄일 수 있다

--

-- Orange for ORACLE 4.0

-- Index [OWI.IDX_GC_CURRENT_REQUEST]

--

CREATE INDEX OWI.IDX_GC_CURRENT_REQUEST

ON OWI.T_GC_CURRENT_REQUEST

(

                ID ASC

)

TABLESPACE OWI_TBS

PCTFREE 10

INITRANS 2

MAXTRANS 255

STORAGE

(

                INITIAL 10485760

                NEXT 10485760

                MINEXTENTS 1

                MAXEXTENTS UNLIMITED

                PCTINCREASE 0

                BUFFER_POOL DEFAULT

)

LOGGING

NOCOMPRESS

NOPARALLEL ;

 

 

 

스크립트에서 추출한 index를 reverse 옵션을 붙여서 재생성

DROP INDEX OWI.IDX_GC_CURRENT_REQUEST;

CREATE INDEX OWI.IDX_GC_CURRENT_REQUEST

ON OWI.T_GC_CURRENT_REQUEST

(

                ID ASC

REVERSE;

 

 

 






 

gc buffer busy wait 이벤트 테스트 및 해결(ADDM ,ASH, AWR report)

buffer busy wait 는 특정 이벤트에 update가 몰려서 생기는 이벤트이다

AWR report는 1시간에 한번씩 snapshot을 찍지만 ASH report는 1초에 한번씩 수집한다



 

>> gc buffer busy 이벤트를 일으키고 ash 결과 레포트를 확인

 

SQL#1> exec dbms_workload_repository.create_snapshot;

SQL#1> @exec




 

SQL#1> exec dbms_workload_repository.create_snapshot;
SQL#1> @?/rdbms/admin/ashrpt.sql

 

 

 

 

top session 을 확인해보면 이벤트를 발생시키는 sid와 serial 번호를 확인할 수 있다

 





 이벤트를 일으키는 DB의 파일의 위치를 확인할 수 있다

 

 




>> ash report로 원인을 알아냈으니 addm report를 떠서 해결방법을 알아본다

 

SQL#1> @?/rdbms/admin/addmrpt.sql

 

RECOMMENDATION 1: Schema, 16% benefit (285 seconds)

      ACTION: Consider using ORACLE's recommended solution of automatic

         segment space management in a locally managed tablespace for the

         tablespace "TBS_GC_BUFFER_BUSY" containing the TABLE

         "OWI.T_GC_BUFFER_BUSY" with object id 11987. Alternatively, you can

         move this object to a different tablespace that is locally managed

         with automatic segment space management.

         RELEVANT OBJECT: database object with id 11987

OWI.T_GC_BUFFER_BUSY 라는 테이블스패이스를 옮기거나 공간을 자동적으로 관리하라고 추천하고 있다

 

 

 

>> addm report에서 pctfree 의 공간을 늘리라는 내용이 있었으므로 다음과 같이 공간을 늘리고 awr compare report를 생성한다

 

SQL> alter table OWI.T_GC_BUFFER_BUSY pctfree 60;

SQL> alter tablespace TBS_GC_BUFFER_BUSY add datafile size 50m;

 

 


비교 레포트를 생성한 결과 위처럼 gc buffer busy 시간과 waits가 줄어든 것을 확인할 수 있다

 

 

 







 

RAC 관련 대기 이벤트


Placeholders while waiting : 대기하는 동안 나타나는 대기 이벤트

Precise events after waiting : 대기한 후에 그 동안 어떤 이유로 대기했는지 이유를 알려 주는 대기 이벤트

대기 이벤트 원인 분석은 ADDM을 통해 할 수 있다

 





gc current 2-way block


gc current block update 관련 이벤트라는 것을 알 수 있다

2-way : 2노드간 발생한 이벤트라는 것을 알 수 있다

내가 update를 하려고 하는데 update 하려고 하는 데이터 블록이 상대편 노드에서 이미 update가 이루어져 redo logfile에 내려쓰는 작업이 있어서 결과를 늦게 본 것이라고 생각할 수 있다

redo logfile이 구성된 스토리지를 write가 빠른 스토리지로 구성하면 해결 된다

 

 

 

 

 

3-way block request




3-way : 3노드간에 데이터 요청과 전송이 있었다는 것을 판단할 수 있다

gc current : update를 하려다가 대기한 것을 알 수 있다

 

 




 

2-way grant





grant : 내가 찾길 원하는 데이터가 어떤 노드에도 없기 때문에 발생했다는 것을 알 수 있고 직접 읽기 위해 권한을 부여하는 과정에서 대기한 것을 알 수 있다

 





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

#46_140818_RAC_TAF  (0) 2014.08.18
#46_140818_RAC_GLOBAL ENQUEUE WAITS  (0) 2014.08.18
#45_140814_RAC_CACHE FUSION  (0) 2014.08.14
#44_140813_RAC_TUNING  (0) 2014.08.13
#44_140813_RAC_DATAFILE 복구  (0) 2014.08.13