개발은 너무해

[스크랩] 대기 이벤트 본문

Oracle/Oracle Scrap

[스크랩] 대기 이벤트

까칠 평생초보 2011.04.14 16:19

개념

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

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

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

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

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' 등이 여기에 속함

session 1(scott 계정)                                        session2(scott 계정)
SQL>conn scott/tiger                                             SQL>conn scott/tiger
Connected.                                                           Connected.
SQL> insert into dept values(90,'DBA','BUSAN');      SQL> insert into dept values(90,'DBA','BUSAN');
1 row created.                                                       Hang 상태에 빠짐
SQL>

session3(system 계정)
sqlplus system/-****
SQL> select *
  2   from   v$session_wait
  3   order by wait_class, event, sid;

SID EVENT
--- ----------------------------
140 enq: TX - row lock contention <-- 대기 이벤트 발생.
SQL> select blocking_session_status, blocking_session
   2   from   v$session
   3   where  sid = 140;

BLOCKING_SESSION_STATUS BLOCKING_SESSION
-----------------------------    --------------------
VALID                                                          155  <-- SID 155가 140을 blocking 하고 있음.

SQL> select * from v$session_wait_class where sid=140;

SID SERIAL# WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED
--- -------- --------------- -------------- ------------ -------------- -------------
140       2564        4217450380                     1 Application                    649            188869
140       2564        3386400367                     5 Commit                       4                  16
140       2564        2723168908                     6 Idle                              36            177751
140       2564        2000153315                     7 Network                          36                   0
140       2564        1740759767                     8 User I/O                           1                   7

->application에 관련된 세션 wait 이벤트가 649회 188869에 걸쳐서 발생됨.


-- session wait history 정보를 자동 저장 관리하고 있다.
SQL> select event, wait_time, wait_count
   2  from v$session_wait_history
   3  where sid=145;

-- wait 이벤트중 (lock 이 걸렸을 때.)
EVENT                                 WAIT_TIME WAIT_COUNT
---------------------------- ----------- -------------
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1

-- wait 이벤트가 끝났을 때
EVENT                                 WAIT_TIME WAIT_COUNT
---------------------------- ----------- -------------
log file sync                                        8                   1
SQL*Net message from client             261                  1
SQL*Net message to client                    0                  1
SQL*Net message from client                2                  1
SQL*Net message to client                    0                  1
enq: TX - row lock contention             150                  1
SQL*Net message from client            9261                  1
SQL*Net message to client                    0                  1
SQL*Net message from client                2                  1
SQL*Net message to client                    0                  1

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

1. 오라클 프로세스가 자신이 작업을 진행할 때 선행 프로세스가 먼저 점유하여 대기 상태에 빠질 경우 
    선행 작업이 끝나고 나서 자신에게 알려주어 일을 진행하거나, 타이머에 설정된 시간에 깨어나 
    선행 프로세스가 작업을 모두 마쳤는지 확인할 때 사라짐.
2. 대기 상태에 빠진 프로세스가 기다리던 리소스를 사용할 수 있게 될 경우
3. 작업을 계속 진행하기 위한 선행작업이 완료 될 경우
4. 해야 할 일이 생겼을 경우
0 Comments
댓글쓰기 폼