10._대기_이벤트

조회 수 6095 추천 수 0 2013.05.06 10:51:23
박영창 *.193.94.20

10. 대기 이벤트

(1) 대기 이벤트란?


오라클 대기 이벤트와 OWI

오라클 내부의 프로세스들이 상호간 커뮤니케이션 및 상호작용을 위해서 다른 프로세스의 작업이 종료될때까지 기다려야하는 상황이 발생. 이때 일을 진행할 수 있는 상황이 될때까지 sleep 상태로 빠지는 것.
▶ 상황이 발생할때 오라클 프로세스는 상태정보를 SGA/파일에 저장. (a kind of logging)

OWI (Oracle Wait Interface) : 오라클 개발자들이 공유 자원에 대한 경합이나 기타 원인에 의한 대기가 발생할 때마다 관련 로그를 생성하도록 커널 코드에 기능을 추가하여 좀 더 다듬어 완성.

Oracle 서버의 Wait Event 를 SQL 서버에서는 Wait Type 이라고 칭함.

오라클 대기 이벤트의 OS적 해석

OS측면에서 대기 이벤트는 다른 프로세스의 작업을 대기하는 동안 CPU 자원할당을 포기하고 sleep state로 빠진 것을 의미. sleep state로 빠진다는 것은 OS kernel 의 job queues 중 wait queue 에 해당 프로세스가 옮겨진다는 것을 말하며, 커널은 wait queue에 들어간 작업에는 CPU 자원을 할당해주지 않는다. (스케쥴링 대상에서 제외)

선행 프로세스가 작업을 종료하면서 OS에게 interrupt 신호를 보내고, OS kernel 은 해당 프로세스를 job qeue 중 runnable queue에 옮김으로써 가능한 빠르게 CPU 자원을 할당 받아 일을 재개한다.


vmstat 결과 화면에서 r = runnable queue / w = wait queue 이다.
runnable queue > # of cpu core 인 상황이거나 wait queue 의 개수가 많은 경우에는 처리에 병목이 생기는 현상.
▶ 오라클에서 어떤 종류의 대기 이벤트가 발생중인지 파악 필요.
pageing 여부 확인은 pin/pout 수치를 보고 확인 가능.

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


모든 대기 이벤트가 데이터베이스 병목의 신호로 나타나는 것은 아님.

SQL*Net message from client, SQL*Net more data from client 사용자의 입력을 대기.
pmon timer, smon timer, px idle 서버 프로세스가 할일이 없을때 발생하는 이벤트.


대기 이벤트가 발생하는 상황

1. 자신이 필요로 하는 특정 리소스가 다른 프로세스에 의해 사용 중일때
   buffer busy waits, latch free, enqueue 관련 대기 이벤트

2. 다른 프로세스에 의해 선행작업이 완료되기를 기다릴때
    write complete waits, checkpoint completed, log file sync, log file switch 이벤트

   > 책에 설명된 DBWR LGWR 동작은 별도로 파악할 것

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

   SQL*Net message from client, PX Deq: Execution Msg 이벤트

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


타임아웃 (timeout) : 특정 시간이 지나면 해당 프로세스가 runnable queue로 들어가서 작업을 시작하거나 작업 완료를 확인함.
타임아웃은 대기 이벤트의 종류에 따라 모두 다름. (DBWR, LGWR 경우 3초)
대기 이벤트가 자주 발생하는 것도 문제이지만 대기 이벤트에 의한 지연 시간이 길어지는 것이므로 더 큰 적신호.

대기중이던 프로세스가 활동을 재개하는 시점

1. 대기 상태에 빠른 프로세스가 기다리던 리소스가 사용 가능해짐
2. 작업을 계속 진행하기 위한 선행작업이 완료
3. 해야 할 일이 생김.

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


래치와 대기 이벤트는 서로 다른 개념.

래 치를 얻는 과정이 경합을 의미하지는 않음. v$latch의 gets 가 증가한다고 시스템 경합이 많다고 할 수 는 없음. 중요한 것은 latch를 획득하는 과정에서 프로세스간의 경합이 발생하였는지를 주목해야함. ( 동시성이 저하됨 )

v$latch 뷰 항목 해설

gets : 래치 요청 횟수
misses : 래치를 요청했으나 다른 프로세스에 의해 자원이 사용 중이어서 바로 래치를 못 획득.
            획득에 실패한 프로세스는 spin 과정에서 래치를 획득하거나 spin 후에도 실패해서 wait state로 빠짐.

simple_gets = gets - misses : 래치를 한번에 획득한 횟수

spin_gets : 래치를 요청한 첫 시도에서 얻지못하고 spin 과정에서 래치를 획득.

spin_gets = misses - sleeps

sleeps : 정해진 횟수만큼 계속 spin을 했으나 래치를 획득하지 못하고 wait state에 들어간 횟수.
            이때 latch free 대기 이벤트 발생
.
※ latch 의 경우 lock 처럼 queueing 매커니즘이 존재하지 않기때문에 반복적인 액세스 시도로 획득할 뿐 우선권의 개념이 없음.

10g 부터는 중요도가 높은 latch free 상세한 정보를 함께 발생시키기 시작함.