오라클 성능 트러블슈팅의 기초 (2012년)
스냅샷 데이터 0 0 20,461

by 구루비스터디 프로파일링 스냅샷 10046 10053 10032 [2023.09.06]


스냅샷 데이터

:간단한 형태의 스냅샷과 리포트

스냅샷 데이터와 리포트를 만드는 기본적인 방법

  • 시점A 에서 스냅샷 A를 만듬
  • 작업을 수행함
  • 시점B에서 스냅샷B를 만듬
  • 스냅샷B 와 스냅샷A의 차이(스냅샷B - 스냅샷A)를 얻음


스냅샷 데이터와 리포트를 만드는 간단한 예제



/**
 -- STEP1. 우선 다음과 같이 V$SYSSTAT뷰에 대한 스냅샷을 만듬
 --        1) V$SYSSTAT뷰의 내용을 테이블 SYSSTAT1에 저장함으로써 스냅샷을 만들수 있음
**/

SQL> create table sysstat1 as select * from v$sysstat;

테이블이 생성되었습니다.



-- STEP2. 그리고 ALL_OBJECTS뷰를 읽는 작업을 수행함

SQL> select count(*) from all_objects;

  COUNT(*)
----------
     60078



-- STEP3. 다음으로 두번째 스냅샷을 테이블 SYSSTAT2에 만듬

SQL> create table sysstat2 as select * from v$sysstat;

테이블이 생성되었습니다.



/**
 -- STEP4. 스냅샷 간의 차이 값이야말로 두 개의 스냅샷에 해당하는 구간(시간 스냅샷~ 끝 스냅샷)에서 어떤 일이 발생했는지를 말해주기 때문임
 --        1) 아래와 같이 두개의 스냅샷, 테이블 SYSSTAT2 와 SYSSTAT1간의 차이(Delta)값을 구함으로써 어떤 변화가 있었는지 알수 있음
 --        2) 아래의 스냅샷 리포트로부터 얻을수 있는 결론 중 하나는 ALL_OBJECTS 뷰를 읽는 작업에 의해 Physical Reads가 2M 바이트 이상 발생한다는 것임
 **/

SQL> -- get delta
SQL> col name format a40
SQL> col delta format 999,999,999,999
SQL> select s1.name , (s2.value - s1.value) as delta
  2  from sysstat1 s1, sysstat2 s2
  3  where s1.statistic# = s2.statistic#
  4  and (s2.value - s1.value) > 0
  5  order by 2 desc;


NAME                                                DELTA
---------------------------------------- ----------------
session pga memory max                         18,219,008
cell physical IO interconnect bytes             3,028,480
session uga memory max                          2,741,368
physical read total bytes                       2,383,872
physical read bytes                             1,564,672
file io wait time                                 665,853
physical write total bytes                        644,608
session pga memory                                196,608
session uga memory                                 80,680
index scans kdiixs1                                69,669
table scan rows gotten                             68,216
.... (중략)



  • 성능트러블 슈팅을 위해서는 보다 많은 수의 뷰들에 대한 스냅샷 데이터가 필요하며, 어떤 뷰라도 성능 문제에 대한 데이터만 제공한다면 스냅샷의 대상이 될수 있음
  • V$SYSSTAT 뷰는 일량(Workload)에 대한 정보만을 제공함
  • V$SYSTEM_EVENT 뷰는 대기 이벤트에 대한 정보를 제공함
  • V$LATCH뷰는 래치활동에 대한 정보를 제공함


:AWR 스냅샷과 리포트

  • 스냅샷 데이터에 대한 리포트 중 가장 광범위한 데이터를 제공하는 것이 AWR리포트임
  • AWR 스냅샷은 1시간마다 한번씩 자동으로 생성됨
  • 하지만 DBMS_WORKLOAD_REPOSITORY패키지를 이용해서 수동으로 생성할수도 있음


AWR리포트를 생성하는 방법

  • 시점A 에서 AWR스냅샷 A를 생성함
  • 특정 작업을 수행함
  • 시점B 에서 AWR스냅샷 B를 생성함
  • 스냅샷B 와 스냅샷A 의 차이(스냅샷B - 스냅샷A)를 얻음


AWR스냅샷을 생성 후 스냅샷간의 차이값을 리포팅하는 예제


-- STEP1. DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT함수를 이용해 스냅샷A 를 만듬

SQL> -- 1st snapshot
SQL> col begin_snap new_value begin_snap;
SQL> col db_id new_value db_id;
SQL> col inst_num new_value inst_num;
SQL> select dbid as db_id from v$database;

     DB_ID
----------
  84928337



SQL> select instance_number as inst_num from v$instance;

  INST_NUM
----------
         1

SQL> select dbms_workload_repository.create_snapshot as begin_snap from dual;

BEGIN_SNAP
----------
         5

-- STEP2. ALL_OBJECTS뷰를 읽는 작업을 수행함

SQL> select count(*) from all_objects;

  COUNT(*)
----------
     60080



-- STEP3. 스냅샷 B를 만듬

SQL> -- 2nd snapshot
SQL> col end_snap new_value end_snap;
SQL> select dbms_workload_repository.create_snapshot as end_snap from dual;

END_SNAP
----------
         6



-- STEP4. DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT[_HTML]함수를 이용해서 스냅샷 B와 스냅샷 A간의 차이점을 리포팅함

SQL> -- AWR report
SQL> select * from table(dbms_workload_repository.awr_report_text(&db_id, &inst_num, &begin_snap, &end_snap));

Top 5 Timed Foreground Events
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

OUTPUT
--------------------------------------------------------------------------------

                                                           Avg
                                                          wait   % DB
Event                                 Waits     Time(s)   (ms)   time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
DB CPU                                                1          49.3
db file sequential read                  80           0      5   29.8 User I/O
control file sequential read             89           0      2   10.7 System I/O
db file scattered read                    4           0      3     .8 User I/O
Disk file operations I/O                  1           0      1     .1 User I/O
Host CPU (CPUs:    2 Cores:    2 Sockets:    1)

... (중략)



왜? 스냅샷은 다양한 방식으로 사용할수 있는 차이점이 존재하는가

  • 어떤 뷰들을 스냅샷의 대상으로 할것인가?
  • 스냅샷간의 차이 값을 어떻게 보여줄 것인가?


:덤프와 스냅샷

  • 오라클 성능 트러블슈팅을 위해 필요한 스냅샷 데이터의 99%는 오라클이 제공하는 동적성능뷰(Dynamic Performanc View)에서 얻을수 있음
  • 하지만 1% 정도의 문제에 대해서는 동적 성능 뷰만으로 부족한 경우가 있음 (빈도는 1%이지만 중요도로 10%이상이라고 생각됨)


PGA의 크기가 계속증가하면서 세션의 성능이 저하되는 현상

  • 이 경우 V$SESSTAT뷰와 동적 성능 뷰를 통해서 얻을 수 있는 것은 PGA의 크기가 매 스냅샷마다 얼마나 증가하느냐임
  • 동적성능뷰를 통하여 가령 1분 가격으로 5개의 스냅샷을 생성했는데, 각 스냅샷마다 PGA의 크기가 100M 바이트씩 증가(즉 각 스냅샷간의 차이값이 100M 바이트) 한다는 사실을 알수 있음
  • 하지만 왜 크기가 증가하는지의 이유를 알수 없음
  • 크기가 커졌다는 사실만 알 수 있고, 왜 크기가 증가했는지를 알 수없다면 트러블슈팅의 궁극적인 목적인 해결책을 만드는것이 불가능함

이런 경우에 사용할수 잇는 것이 PGA 힙 덤프임


PGA힙 덤프를 수행하는 예제


-- STEP1. PGA힙 덤프 수행
SQL> -- every dump is snapshot data!!!
SQL> alter session set events 'immediate trace name heapdump level 1';

세션이 변경되었습니다.

-- STEP2. 현재 프로세스의 PGA힙 정보가 트레이스 파일에 기록됨

HEAP DUMP heap name="pga heap"  desc=0BBC9830
 extent sz=0x206c alt=108 het=32767 rec=0 flg=3 opc=2
 parent=00000000 owner=00000000 nex=00000000 xsz=0xfff8 heap=00000000
 fl2=0x60, nex=00000000
EXTENT 0 addr=0D230008
  Chunk  d230010 sz=    65520    free      "               "
EXTENT 1 addr=0D220008
  Chunk  d220010 sz=     1628    freeable  "diag pga       "  ds=0CEE04C0
  Chunk  d22066c sz=     4164    freeable  "diag pga       "  ds=0CEE04C0
  Chunk  d2216b0 sz=     4164    freeable  "diag pga       "  ds=0CEE04C0
  Chunk  d2226f4 sz=     8224    freeable  "PLS PGA hp     "  ds=08AE8EA8
  Chunk  d224714 sz=     2096    freeable  "PLS PGA hp     "  ds=08AE8EA8
  Chunk  d224f44 sz=     8284    recreate  "PLS PGA hp     "  latch=00000000


PGA 힙 덤프와 같은 덤프 데이터는 가장 자세한 형태의 스냅샷 데이터라고 볼수 있음
이런 종류의 스냅샷 데이터는 지나치게 정밀하기 때문에 다른 종류의 스냅샷 데이터 처럼 차이(Delta)값을 구하는 것이 어려우며 큰 의미도없고 사용시 적절한 형태로 집계할 필요가 있음

"데이터베이스 스터디모임" 에서 2012년에 "오라클 성능 트러블슈팅의 기초 " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4288

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입