참고 자료
http://www.oracle.com/technology/global/kr/pub/articles/10gdba/index.html
코어 스터디 : 강정식님 스터디 자료

대기 이벤트..(활용은 3장에서...ㅋ)

개념

  • 대기 이벤트란 오라클 인스턴스 내에서 공유된 자원을 사용하기 위해 프로세스들이 점유를 해야 하는데 이 때 점유를 하지 못하는 상태에서는
    Sleep 상태에 바지며 이 때 발생되는 현상을 대기 이벤트라고한다. 그때마다 오라클은 그 상태 정보를 파일 또는 SGA 메모리 내에 저장해 둔다.
  • 오라클 개발자들이 디버깅 용도로 개발한 것이라고 한다. 그것이 오늘에 이르러 OWI라는 이름을 덧입으면서 성능 관리 분야에 일대 변혁을 가져오게 된다.

종류


SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SELECT WAIT_CLASS,
       NAME,
       PARAMETER1,
       PARAMETER2,
       PARAMETER3
FROM   V$EVENT_NAME
ORDER BY WAIT_CLASS,
         NAME
;

시스템 커널 레벨에서의 표현

  • 다른 프로세스를 기다려야 하는 상황에서 CPU를 쥔 채 대기하면 불필요하게 CPU자원을 낭비하는 것이므로 CPU를 OS에 반환하고 수면(Sleep)상태로 빠지는 것을 말한다.
  • 수면 상태에 빠지다는 것은 프로세스가 wait queue로 옮겨지는 것을 말하며, wait queue에 놓인 프로세스에게는 CPU를 할당? 줄 필요가 없으므로 OS는 해당 프로세스를
    스케쥴링 대상에서 제외 시킨다.
  • 선행 프로세스가 일을 마치면 OS에게 그 사실을 알려 자신을 기다리던 수면 상태의 프로세스를 깨우도록 신호를 보낸다. 그럼 OS는 그 프로세스를 runnalble queue에 옮김으로서 가능한 빨리 CPU를 할당 받아 일을 재개할 수 있도록 스케쥴링한다.

vmstat


vmstat 1 1000

-* 서버의 가상 메모리 통계정보를 보기위한 명령어
-* vmstat 명령은 커널 스레드, 가상 메모리, 디스크, 트랩 및 CPU 활동에 대한 통계를 보고함.
-* vmstat 명령으로 작성된 보고서는 시스템 로드 활동의 균형을 유지하는 데 사용될 수 있으며
이 시스템 전반에 대한 통계(모든 프로세서 중에서의 통계)는 비율로 표시된 값의 평균 또는 합계로 계산됨.
-* 구문


vmstat [ -f ] [ -i ] [ -s ] [ -I ] [ -t ] [ -v ] [ -w] [ -l ] [ { -p | -P } pagesize | ALL ] ALL ] [ PhysicalVolume ... ] [ Interval [ Count ] ]

-t   : 출력의 각 행 다음에 시간 소인을 출력하며 시간 소인은 HH:MM:SS 형식으로 표시됨
60   : 60초 간격으로 출력하도록 함
1000 : 한번에 1000개의 로우를 출력하도록 함

  • 출력 결과
rbavmfrerepipofrsrcyinsycsussyidwahr mi se
7243132936200000051862771605546409411403740684508:48:06
7263137616206201073894736105787427441765641884308:49:06
9333145090208101070473757305813579152022843954408:50:06
7553140985971201091425183508203393442042837925208:51:06
7523152171200101083965135607999406042029636925308:52:06
  • 항목 설명
대분류소분류설명
kthrr현재 일을 수행 중이거나 runnable queue에서 CPU 리소스를 기다리는 프로세스 개수
b샘플 간격을 통해 VMM 대기행렬에서 대기 중인 커널 스레드의 평균 개수(대기 중인 자원, 대기 중인 입출력)
memoryavm사용 중인 가상 페이지
fre사용 가능 리스트의 크기(실제 메모리의 많은 부분이 파일 시스템 데이터를 위한 캐쉬로 이용되며 사용 가능 리스트 크기의 양이 적게 남는 일은 드뭄)
pagere호출기 입출력 리스트
pi페이징 공간에서 들어오는 페이지
po페이징 공간으로 나가는 페이지
fr사용 가능 페이지(페이지 교체)
sr페이지 교체 알고리즘에 의해 스캔되는 페이지
cy페이지 교체 알고리즘에 의한 시간 주기
faultsin장치 인터럽트
sy시스템 호출
cs커널 스레드 문맥 전환
cpuus사용자 시간
sy시스템 시간
idCPU 유휴 시간
wa시스템이 미결 디스크/NFS 입출력 요청을 보유하는 동안의 CPU 유휴 시간
timehr mi ss시분초

대기 이벤트는 언제 발생할까.?

1. 자신이 필요로 하는 특정 리소스가 다른 프로세스에 의해 사용중일 때

  • 자신이 읽으려는 버퍼에 다른 프로세스가 쓰기 작업을 진행 중이라면 선행 프로세스가 일을 마칠 때까지 기다려야 하며
    'buffer busy waits', 'latch free', 'enqueue' 이벤트 등이 여기에 속함

2. 다른 프로세스에 의해 선행작업이 완료되기를 기다릴 때

  • DBWR가 Dirty 버퍼를 디스크에 기록할 때, 먼저 LGWR가 로그 버퍼에 있는 Redo Entry를 Redo Log 파일에 기록하는 작업이
    선행되야 하는데 이 때 DBWR는 LGWR를 깨워 로그 버퍼를 비우라는 신호를 보내고 LGWR가 일을 마칠 때까지 수면 상태에서
    휴식을 취함.
    LGWR가일을 마치면 DBWR를 개ㅜ고 자신은 다시 대기 상태로 빠지며, 'write complete waits', 'checkpoint completed',
    'log file sync', 'log file switch' 이벤트 등이 여기에 속함

3. 할 일이 없을 때(idle 대기 이벤트)

  • 서버 프로세스는 쿼리 결과를 사용자에게 전송하는 동안 Array 단위로 일을 처리하는데, Array 크기만큼 데이터를 전송하면
    다음 Fetch Call을 받을 때까지 기다림. 쿼리 결과집합을 모두 전송하고 나서도 다음 Parse Call 또는 Execute Call을 받을
    때까지 기다리며 'SQL*Net message from client' 등이 여기에 속함

TEST..

SESSION1


SQL>  conn sys/sys@erm as sysdba
연결되었습니다.
SQL> drop table t1 purge;

테이블이 삭제되었습니다.

SQL> create table t1(c1 int, c2 varchar2(10)); 

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

SQL> insert into t1          
  2  select level, 'AAA'     
  3  from dual               
  4  connect by level < 10000
  5  ;

9999 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> update t1 set c2 = 'SESSION1' where c1 = 1;

1 행이 갱신되었습니다.

SQL> select * from t1 where c1 = 1;

        C1 C2
---------- ----------
         1 SESSION1
         
SQL> column wait_class format a10
SQL> column event format a50
SQL> column sid format 999999
SQL> column state format a10
SQL> column wait_time format 999999
SQL> column seconds_in_wait format 999999
SQL> set linesize 20000         
SQL> select wait_class, event, sid, state, wait_time, seconds_in_wait                                    
  2  from v$session_wait                                                                                 
  3  order by wait_class, event, sid                                                                     
  4  ;                                                                                                   
                                                                                                         
WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------     
Idle       SQL*Net message from client                           135 WAITING            0            2975
Idle       SQL*Net message from client                           137 WAITING            0               0
Idle       SQL*Net message from client                           140 WAITING            0               1
Idle       SQL*Net message from client                           145 WAITING            0              12
Idle       SQL*Net message from client                           158 WAITING            0               6
Idle       Streams AQ: qmn coordinator idle wait                 154 WAITING            0          172184
Idle       Streams AQ: qmn slave idle wait                       149 WAITING            0             736
Idle       Streams AQ: waiting for messages in the queue         143 WAITING            0               1
Idle       Streams AQ: waiting for time management or cleanup    152 WAITING            0           10717
            tasks                                                                                        
                                                                                                         
                                                                                                         
WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------     
Idle       jobq slave wait                                       157 WAITING            0               5
Idle       pmon timer                                            170 WAITING            0           86538
Idle       rdbms ipc message                                     160 WAITING            0           26924
Idle       rdbms ipc message                                     161 WAITING            0             382
Idle       rdbms ipc message                                     162 WAITING            0               6
Idle       rdbms ipc message                                     163 WAITING            0          170390
Idle       rdbms ipc message                                     165 WAITING            0               0
Idle       rdbms ipc message                                     166 WAITING            0               0
Idle       rdbms ipc message                                     167 WAITING            0              24
Idle       rdbms ipc message                                     168 WAITING            0           87533
Idle       rdbms ipc message                                     169 WAITING            0               3
                                                                                                         
WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------     
Idle       smon timer                                            164 WAITING            0               5
Idle       wait for unread message on broadcast channel          144 WAITING            0              18
Network    SQL*Net message to client                             142 WAITED SHO        -1               0
                                                                     RT TIME                             
                                                                                                         
                                                                                                         
23 개의 행이 선택되었습니다.                                                                             
                                                                                                         
SQL> -- 대기 이벤트가 발생하지 않음       
SQL> -- SESSION2에 해당 로우에 업데이트(아직 SESSION1 커밋 전 상황) 위 사황..
SQL> select wait_class, event, sid, state, wait_time, seconds_in_wait                                    
  2  from v$session_wait                                                                                 
  3  order by wait_class, event, sid                                                                     
  4  ;    
  
WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Applicatio enq: TX - row lock contention                         141 WAITING            0              30
n

Idle       SQL*Net message from client                           137 WAITING            0               9
Idle       SQL*Net message from client                           140 WAITING            0             260
Idle       SQL*Net message from client                           145 WAITING            0              19
Idle       SQL*Net message from client                           158 WAITING            0              51
Idle       Streams AQ: qmn coordinator idle wait                 154 WAITING            0          172443
Idle       Streams AQ: qmn slave idle wait                       149 WAITING            0             995
Idle       Streams AQ: waiting for messages in the queue         143 WAITING            0               3
Idle       Streams AQ: waiting for time management or cleanup    152 WAITING            0           10976

WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
            tasks

Idle       jobq slave wait                                       135 WAITING            0               4
Idle       pmon timer                                            170 WAITING            0           86797
Idle       rdbms ipc message                                     160 WAITING            0           27183
Idle       rdbms ipc message                                     161 WAITING            0             203
Idle       rdbms ipc message                                     162 WAITING            0               6
Idle       rdbms ipc message                                     163 WAITING            0          170649
Idle       rdbms ipc message                                     165 WAITING            0               0
Idle       rdbms ipc message                                     166 WAITING            0               3
Idle       rdbms ipc message                                     167 WAITING            0              12

WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle       rdbms ipc message                                     168 WAITING            0           87792
Idle       rdbms ipc message                                     169 WAITING            0               3
Idle       smon timer                                            164 WAITING            0             264
Idle       wait for unread message on broadcast channel          144 WAITING            0               6
Network    SQL*Net message to client                             142 WAITED SHO        -1               0
                                                                     RT TIME


23 개의 행이 선택되었습니다.

SQL> --TX - row lock contention 발생
SQL> select BLOCKING_SESSION_STATUS, BLOCKING_SESSION
  2  from v$session 
  3  where sid = 141;

BLOCKING_SE BLOCKING_SESSION
----------- ----------------
VALID                    142

SQL> -- SID 142가 141을 블록킹 하고있음
SQL> -- 얼마나 많은 wait가 발행 하는가?
SQL> select * from v$session_wait_class where sid = 141;

   SID    SERIAL# WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED
------ ---------- ------------- ----------- ---------- ----------- -----------
   141      60280    4217450380           1 Applicatio         106       31199
                                            n

   141      60280    2723168908           6 Idle                 7        3944
   141      60280    2000153315           7 Network              7           0

SQL> --어플리케이션에 관련된 세션 Wait이벤트가 106회   31199에 걸쳐 발생됨
SQL> --이 방법을 응용하여, wait class에 관련한 시스템의 전반적인 통계를 확인할 수도 있습니다. (여기
에서도 시간은 centi-second 단위로 표시됩니다.)
SQL> select * from v$system_wait_class;

WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED
------------- ----------- ---------- ----------- -----------
   1893977003           0 Other          1034683       13542
   4217450380           1 Applicatio       17474      555960
                          n

   3290255840           2 Configurat         546        3703
                          ion

   3875070507           4 Concurrenc        4093        3650
                          y

   3386400367           5 Commit           17357        9358

WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED
------------- ----------- ---------- ----------- -----------
   2723168908           6 Idle           5261123   387553551
   2000153315           7 Network         260698          87
   1740759767           8 User I/O         16560       41880
   4108307767           9 System I/O     3256439      130560

9 개의 행이 선택되었습니다.       
                                              
SQL> -- 문제의 패텬마 암시할뿐 정확한 패턴 조회는 wait class의 히스토리 뷰를 조회해야 한다.
SQL> --V$WAITCLASSMETRIC 뷰는 지난 1분 동안의 wait class 통계를 제공합니다. 
SQL> select wait_class#, wait_class_id, 
  2  average_waiter_count "awc", dbtime_in_wait,
  3  time_waited,  wait_count
  4  from v$waitclassmetric
  5  /

WAIT_CLASS# WAIT_CLASS_ID        awc DBTIME_IN_WAIT TIME_WAITED WAIT_COUNT
----------- ------------- ---------- -------------- ----------- ----------
          0    1893977003          0              0           0          0
          1    4217450380  .99997805     99.9242408   5999.8683         24
          2    3290255840          0              0           0          0
          3    4166625743          0              0           0          0
          4    3875070507 .000119233     .011914562       .7154          1
          5    3386400367 .000062167     .006212093        .373          3
          6    2723168908 16.7111041              0  100266.624        371
          7    2000153315 2.3833E-06     .000238158       .0143         56
          8    1740759767          0              0           0          0
          9    4108307767 .000602167     .060172368       3.613         26
         10    2396326234          0              0           0          0

WAIT_CLASS# WAIT_CLASS_ID        awc DBTIME_IN_WAIT TIME_WAITED WAIT_COUNT
----------- ------------- ---------- -------------- ----------- ----------
         11    3871361733          0              0           0          0

12 개의 행이 선택되었습니다.

--1분동안 4217450380 WAIT_CLASS_ID값을 갖는 WAIT CLASS를 0.9개의 세션이 총 24회 5999 5999 centi-secondd에 걸쳐 대기했음을 알수있다.

-- 아래는 wait 이벤트가 종료된 상황에는 더이상 남아있지않음 이럴경우는 10g는 session wait 히스토리 정보를 자동 저장하고 관리하며, 이 결과는 V$SESSION_WAIT_HISTORY 뷰를 통해 조회할수 있다.
SQL> select event, wait_time, wait_count
  2  from v$session_wait_history
  3  where sid = 141
  4  /

EVENT                                              WAIT_TIME WAIT_COUNT
-------------------------------------------------- --------- ----------
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1
enq: TX - row lock contention                            300          1

10 개의 행이 선택되었습니다.
--세션이 inactive 상태가 되거나 연결이 끊어진 경우, 관련된 기록도 뷰에서 삭제됩니다. 하지만 히스토리 정보는 AWR 테이블에 별도로 저장됩니다. AWR의 V$ACTIVE_SESSION_HISTORY 뷰는 session wait에 관련한 정보를 제공합니다.

SESSION 2


update t1 set c2 = 'SESSION2' where c1 = 1

대기 이벤트는 언제 사라질까?

  • 오라클 프로세스가 자신이 작업을 진행할 대 선행 프로세스가 먼저 점유하여 대기 상태에 빠질 경우 선행작업이 끝나고 나서
    자신에게 알려주어 일을 진행하거나, 타이머에 설정된 시간에 깨어나 선행 프로세스가 작업을 모두 마쳤는지 확인할 때 사라짐

1. 대기 상태에 빠진 프로세스가 기다리던 리소스를 사용할 수 있게 될 경우
2. 작업을 계속 진행하기 위한 선행작업이 완료될 경우
3. 해야 할 일이 생겼을 경우

TEST

  • 바로 SESSION commit....

...
SQL> commit;

커밋이 완료되었습니다.
SQL> select wait_class, event, sid, state, wait_time, seconds_in_wait  
  2  from v$session_wait                                               
  3  order by wait_class, event, sid                                   
  4  ;                                                                 

WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle       SQL*Net message from client                           137 WAITING            0               0
Idle       SQL*Net message from client                           140 WAITING            0              26
Idle       SQL*Net message from client                           141 WAITING            0              37
Idle       SQL*Net message from client                           158 WAITING            0             112
Idle       Streams AQ: qmn coordinator idle wait                 154 WAITING            0          181329
Idle       Streams AQ: qmn slave idle wait                       149 WAITING            0            6797
Idle       Streams AQ: waiting for messages in the queue         143 WAITING            0               1
Idle       Streams AQ: waiting for time management or cleanup    152 WAITING            0           19862
            tasks

Idle       jobq slave wait                                       135 WAITING            0              50

WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle       pmon timer                                            170 WAITING            0           95683
Idle       rdbms ipc message                                     160 WAITING            0           36069
Idle       rdbms ipc message                                     161 WAITING            0             527
Idle       rdbms ipc message                                     162 WAITING            0              67
Idle       rdbms ipc message                                     163 WAITING            0          179535
Idle       rdbms ipc message                                     165 WAITING            0               0
Idle       rdbms ipc message                                     166 WAITING            0               0
Idle       rdbms ipc message                                     167 WAITING            0               7
Idle       rdbms ipc message                                     168 WAITING            0           96678
Idle       rdbms ipc message                                     169 WAITING            0             112
Idle       smon timer                                            164 WAITING            0            2648

WAIT_CLASS EVENT                                                 SID STATE      WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle       wait for unread message on broadcast channel          144 WAITING            0              22
Network    SQL*Net message to client                             142 WAITED SHO        -1               0
                                                                     RT TIME


22 개의 행이 선택되었습니다.                                                               

SQL> select event, wait_time, wait_count
  2  from v$session_wait_history        
  3  where sid = 141                    
  4  /

EVENT                                              WAIT_TIME WAIT_COUNT
-------------------------------------------------- --------- ----------
SQL*Net message to client                                  0          1
SQL*Net message from client                                0          1
SQL*Net message to client                                  0          1
SQL*Net message from client                             4135          1
SQL*Net message to client                                  0          1
SQL*Net message from client                                5          1
SQL*Net message to client                                  0          1
SQL*Net message from client                               12          1
SQL*Net message to client                                  0          1
SQL*Net message from client                               24          1

10 개의 행이 선택되었습니다.

-- ^^; 히스토리 뷰에는 남아있어야하는데 사라지는군요 ;;;

래치와 대기 이벤트 개념 명확화

  • 래치를 얻는 과정 자체가 경합을 의미하지는 않는다. 공유된 자원을 읽으려면 래치를 얻는 것이 당연한 일이므로
    v$latch 뷰에서 gets 횟수가 증가한다고 해서 문제 될 것은 없다. 다만 래치를 얻는 과정중에서 다른 프로세스와 경합이 발생하는지를 관심 있게 살펴봐야 하며, 마약 그렇다면 시스템 동시성이 저하되므로 문제다.

SQL> column addr format a20;
SQL> column latch# format 99999;
SQL> column level# format 99999;
SQL> column name format a50;
SQL> column get format 99999999999999;
SQL> column misses format 9999999999999;
SQL> column spin_gets format 99999999999999;
SQL> column sleeps format 9999999999;
SQL> set linesize 20000;
SQL> 
SQL> SELECT *
  2  FROM   (SELECT ADDR,
  3                 LATCH#,
  4                 LEVEL#,
  5                 NAME,
  6                 GETS,
  7                 MISSES,
  8                 SPIN_GETS,
  9                 SLEEPS
 10          FROM   V$LATCH
 11          ORDER BY 2)
 12  WHERE  ROWNUM <= 10
 13  ;

ADDR                 LATCH# LEVEL# NAME                                                     GETS         MISSES       SPIN_GETS      SLEEPS
-------------------- ------ ------ -------------------------------------------------- ---------- ---
03C3C050                  0      8 event range base latch                                      0              0               0           0
03C3C0B8                  1      8 post/wait queue                                         30366              0               0           0
03C3C120                  2      0 hot latch diags                                             0              0               0           0
03C3C368                  3      1 process allocation                                       8383              0               0           0
03C3C3D0                  4      5 session allocation                                   92865706           5507            5496          11
03C3C440                  5      0 session switching                                        3166              0               0           0
03C3C4A8                  6      0 process group creation                                   8383              0               0           0
03C3C510                  7      1 session idle bit                                      4341909             22              22           0
03C3C580                  8      7 client/application info                                 91516              0               0           0
03C3CAB0                  9      8 longop free list parent                                   313              0               0           0

10 개의 행이 선택되었습니다.

  • ADDR : 래치 오브젝트 주소
  • LATCH# : 래치 번호
  • LEVEL# : 래치 레벨
  • NAME : 래치 이름
  • GETS : 래치 요청 횟수
  • MISSES : 래치를 요청했는데 다른 프로세스에 의해 자원이 사용 중이어서 첫 번째 시도에서 바로 래치를 얻지 못하는 횟수
    (바로 래치 획득에 성공한 횟수 = GETS - MISSES)
  • SPIN_GETS : 래치를 요청한 첫 번째 시도에서 곧바로 래치를 얻지는 못했지만 이후 SPIN하는 과정에서 래치 획등에 성공한 횟수
  • SLEEPS : 래치를 용청했는데 자원이 사용 중이어서 곧바로 래치를 얻지 못하고 정해진 횟수만큼 계속 SPIN 했는데도 결국 래치를 얻지 못해 대기 상태로 빠진 횟수.
    이때 발생하는 것이 'latch free'이벤트. 10g 이후버터는 이 이벤트를 세분화하여 'latch: cache buffer chains', latch ; library cache lock'

래치 관련 참고 사이트
http://wiki.gurubee.net/pages/viewpage.action?pageId=1343499
http://wiki.ex-em.com/index.php/Latch_free