오라클 성능 트러블슈팅의 기초 (2012년)
예외적인 데이터를 0 0 20,339

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


예외적인 데이터를

  • 동적 성능 뷰(Dynamic Performance View)와 덤프 파일은 대부분 스냅샷 데이터에 해당하며, 진단이벤트는 프로파일링 데이터에 해당함
  • 하지만 예외적인 데이터들이 있음


:액티브 세션 히스토리

  • V$ACTIVE_SESSION_HISTORY 뷰는 1초 간격으로 저장된 액티브 세션의 과거 목록을 가지고 있음
  • 따라서 V$ACTIVE_SESSION_HISTORY 뷰는 동적 성능 뷰임에도 불구하고 프로파일링 데이터로 분류할수 있음

V$ACTIVE_SESSION_HISTORY 뷰로 확인되는 데이터를 확인


-- Note: 

SQL> -- v$active_session_history
SQL> col sid format 999
SQL> col sql_text format a20
SQL> col event format a10
SQL> col sid new_value sid
SQL> select  to_char(h.sample_time,'mi:ss') as sample_time
  2        , h.sample_id
  3        , h.session_id as sid
  4        , h.session_state as st
  5        , h.sql_id
  6        , (select sql_text from v$sqlarea a where a.sql_id = h.sql_id) as sql_text
  7        , event
  8        , blocking_session as blocker
  9  from    v$active_session_history h
 10  where   session_id = &sid
 11  ;
구  10: where   session_id = &sid
신  10: where   session_id =         12

SAMPL  SAMPLE_ID  SID ST      SQL_ID        SQL_TEXT             EVENT         BLOCKER
----- ---------- ---- ------- ------------- -------------------- ---------- ----------
44:30       8747   12 ON CPU  9tz4qu4rj9rdp select count(*) from
                                             all_objects

37:40       8338   12 ON CPU  25vwt55t1093f select to_clob(
                                                 restart||queue_
                                            schema||'.'||queue_n
                                            ame || '(' || queue_

... (중략)

  • 스냅샷 데이터를 아주 빈번하게 엑세스하면 프로파일링 데이터가 된다는 원리가 가장 이상적으로 구현된 뷰가 V$ACTIVE_SESSION_HISTORY뷰라고 할수 있음


:콜 스택덤프

  • 콜 스택 덤프는 특정 프로세스의 현재 시점에서의 함수 히스토리를 시간의 역순으로 출력하는 기능을 제공함

콜 스택 덤프 생성으로 확인되는 데이터를 확인


-- STEP1. 콜 스택 덤프 명령을 수행하면 트레이스 파일에 다음과 같이 함수 호출 히스토리가 출력됨

SQL> -- callstack data is snapshot + profiling
SQL> alter session set events 'immediate trace name callstack level 1';
세션이 변경되었습니다.



-- STEP2. 아래의 결과가 의미하는 것은 서버 프로세스가 현재의 명령을 처리하기 위해 
--        1) { 00000000 -> 76EA3779 -> _OracleThreadStart -> _opimai -> ... -> _ksedst_tracecb -> _skdstdst } 의 순서로 함수를 호출 중이라는 것을 의미함
--        2) 현재 호출 중인 가장 함수는 가중 위에 있는 _skdstdst  함수임

----- Call Stack Trace -----
calling              call     entry                argument values in hex      
location             type     point                (? means dubious value)     
-------------------- -------- -------------------- ----------------------------
EnumerateLoadedModules64 failed with error -1073741819
_skdstdst()+121      CALLrel  _kgdsdst()           E8E9768 0
_ksedst1()+93        CALLrel  _skdstdst()          E8E9768 0 0 436646 435BE2
                                                   436646
_ksedst_tracecb()+5  CALLrel  _ksedst1()           0 0
4                                                  
_dbkdaKsdActDriver(  CALLreg  00000000             1
)+3615                                             
06E05165             CALLreg  00000000             DB40454 E8EAEA0
06E05D11             CALLrel  06E04E06             DB40454 5C0D830 20C0003
                                                   E8EAEA0 1
06DFE9A5             CALLrel  06E059F2             DB40454 DB4ECF4
075B4D0A             CALLrel  06DFE972             DB40454 DB4ECD8
_dbkdParseCmd()+395  CALLrel  _dbgdParseCmd()      DB40454 BC20380 E13FFD0
                                                   DB413C8 1D843C84 26 3 0 0
                                                   E8EB4FC
__VInfreq__kkyase()  CALLrel  _dbkdParseCmd()      1D843C84 26 3 E8EB4FC
+5166                                              
_kksExecuteCommand(  CALLrel  _kkyase()            1D843C74
)+1024                                             
_opiexe()+17037      CALLrel  _kksExecuteCommand(  E4902A0 2 E8ECA98
                              )                    
_kpoal8()+2109       CALLrel  _opiexe()            49 3 E8ECA98
_opiodr()+1248       CALLreg  00000000             5E 1C E8EF070
61AB29CD             CALLreg  00000000             5E 1C E8EF070 0
_opitsk()+1404       CALL???  00000000             BC2AC00 5E E8EF070 0 E8EED00
                                                   E8EF19C 53E52E 0 E8EF1C8
_opiino()+980        CALLrel  _opitsk()            0 0
_opiodr()+1248       CALLreg  00000000             3C 4 E8EFBC4
_opidrv()+1201       CALLrel  _opiodr()            3C 4 E8EFBC4 0
_sou2o()+55          CALLrel  _opidrv()            3C 4 E8EFBC4
_opimai_real()+124   CALLrel  _sou2o()             E8EFBD4 3C 4 E8EFBC4
_opimai()+125        CALLrel  _opimai_real()       2 E8EFBFC
_OracleThreadStart@  CALLrel  _opimai()            2 E8EFF3C 0 70 FFFFFFFF
4()+830                                            FFFFFFFF
752EED67             CALLptr  00000000             E7EFF6C E8EFFD4 76EA377B
                                                   E7EFF6C 787D2C88 0
76EA3779             CALLreg  00000000             E7EFF6C 787D2C88 0 0 E7EFF6C
                                                   0
76EA3749             CALLrel  76EA3754             401326 E7EFF6C 0 0 0 0
00000000             CALL???  00000000             
----- End of Call Stack Trace -----



  • 이처럼 콜 스택 덤프의 결과는 스냅샷이면서 동시에 프로파일링 이기도 한 독특한 데이터임
  • 만일 콜 스택 덤프를 여러 번 수행하면 여러 개의 콜 스택이 기록될 것이며, 콜 스택에 대한 프로파일링 데이터를 얻을수 있음
  • 이 데이터를 분석하면 시간에 따라 콜 스택이 어떻게 변하는지, 어떤 콜 스택이 주로 사용되는지 알 수 있음

콜 스택를 여러번 수행하여 여러 개의 기록을 기반으로 프로파일링 데이터를 확인


SQL> select * from table(tpack.callstack_prof_report(&sid));


:10032 진단 이벤트

  • 10046 진단 이벤트나 10053 진단 이벤트와 같이 진단 이벤트들은 주로 프로파일링 데이터를 얻는데 사용되지만 또 다른 많은 수의 진단 이벤트들은 현재 상태에 대한 정보를 얻는 목적으로 사용되기도함
  • 예를들어 10032 진단 이벤트는 정렬작업에 대한 스냅샷 데이터를 얻는 목적으로 사용됨


10032 진단 이벤트 정의


prompt> oerr 10032
"sort statistics (SOR*)"
// *Cause:
// *Action:


10032 진단 이벤트에 의해 생성되는 스냅샷 데이터를 확인



-- STEP1. 10032 진단 이벤트를 활성화한 상태에서 쿼리를 수행함

SQL> -- 10032 trace 
SQL> ALTER SESSION SET EVENTS '10032 trace name context forever, level 10';
세션이 변경되었습니다.


SQL> select OWNER, count(*) from ALL_OBJECTS group by OWNER order by OWNER;

OWNER                            COUNT(*)
------------------------------ ----------
APPQOSSYS                               3
DBSNMP                                 57
EXFSYS                                187
MAZAL                                   3
OLAPSYS                               717
ORACLE_OCM                              8
OUTLN                                   8
PUBLIC                              24438
SYS                                 30447
SYSMAN                               3404
SYSTEM                                503
WMSYS                                 306


-- STEP3. 10032 진단 이벤트 결과를 확인
--        마치 V$SESSTAT뷰 처럼 현재 상태에 대한 스냅샷 데이터를 제공하고 있음

---- Sort Parameters ------------------------------
sort_area_size                    65536
sort_area_retained_size           65536
sort_multiblock_read_count        1
max intermediate merge width      3
---- Sort Statistics ------------------------------
Input records                             60081
Output records                            12
Total number of comparisons performed     150601
  Comparisons performed by in-memory sort 150601
Total amount of memory used               2048
Uses version 1 sort
---- End of Sort Statistics -----------------------


  • 진단 이벤트가 제공하는 데이터의 다양성을 소개하기 위해서 10032 진단 이벤트를 예제로 다룸


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

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

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

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

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