1. OWI 란?
프로세스가 겪는 대기현상을 기록하고 관찰하는 일련의 기능과 인터페이스, 그리고 방법론을 통칭하여 OWI, 즉 Oracle Wait Interface 라고 부른다.
프로세스가 특정 자원을 획득하지 못하고 대기하는 것을 "XXX 이벤트를 대기한다" 고 표현한다.
이벤트 혹은 대기이벤트는 프로세스가 특정 자원을 획득할 때가지 발생하기를 기다리는 "사건"으로 정의할 수 있다.
오라클은 대기회수, 타임아웃회수, 대기시간 이라는 세 가지 값을 이용해 대기현상을 표현한다.
사용자 관점에서 가장 의미가 있는 것은 "대기시간" 이다.
Response Time = Service Time + Wait Time
Service Time 과 Wait Time 을 낮추면 자연스럽게 응답시간이 낮아지고 사용자의 성능 만족도는 증가한다.
어떤 문제들은 Service Time 을 낮추면 자연스럽게 Wait Time 이 낮아지기도 한다.
어떤 문제들은 Service Time 을 낮추는 것은 불가능한 반면 Wait Time 을 낮추는 것만이 유일한 방법인 경우도 많다.
2. OWI 의 특징
1) OWI 는 문제 지향적 (Problem-Oriented) 이다
오라클은 문제가 생길 때마다, 즉 원하는 자원을 획득하는데 실패할 때마다 특정 이벤트를 대기함으로써 현재 어떤 문제가 발생했고, 왜 발생했는지를 보고한다.
또한 추가적인 분석을 통해 어떤 프로세스에 의해 문제가 발생했는지의 여부 또한 분석이 가능하다.
따라서 현재 시스템에 발생한 대기현상에 초점을 맞추면 가장 직관적으로 성능문제를 파악할 수 있다
10g 부터 제공되는 AWR (Automatic Workload Repository) 의 성능이력 관리 기능을 이용하면, 과거 특정 시점의 성능문제까지도 OWI 에 기반해서 분석할 수 있다.
2) OWI 는 정량적이다.
OWI 는 "추측" 이 아닌 "사실" 과 "숫자" 에 기반한 성능분석을 가능하게 해준다.
OWI 는 문제가 왜 발생했는지 뿐만 아니라 구체적으로 어떤 정도의 성능문제를 유발하고 있는지를 표현해준다.
3) OWI 는 징후학적이다.
오라클 성능문제에서도 기존에 관찰되지 않았던 새로운 대기현상들이 발생할 수 있다.
4) OWI 는 개선중이다.
OWI 는 끊임없이 진보하는 방법론이다.
3. OWI 툴
OWI 방법론에서 직/간접적으로 사용할 수 있는 툴
- OWI 다이나믹 뷰
- 기타 중요 다이나믹 뷰
- Extended SQL Trace
- oradebug & dump
- Automatic Workload Repository
1) OWI 다이나믹 뷰
V$EVENT_NAME - 모든 대기 이벤트에 대한 참조성 정보 제공
V$SYSTEM_EVENT - 인스턴스 기동 후 지금까지 모든 세션에서 발생한 대기이벤트의 누적 정보 제공
V$SESSION_EVENT - 현재 접속되어 있는 각 세션별 대기이벤트의 누적 정보 제공
V$SESSION_WAIT - 각 세션이 현재 대기하고 있는 이벤트에 대한 상세정보 제공
V$SESSION_WAIT_HISTORY - V$SESSION_WAIT 정보를 10개 까지 누적 제공
V$SYSTEM_WAIT_CLASS - V$SYSTEM_EVENT 와 동일한 차원의 값을 클래스 기준으로 제공
V$SESSION_WAIT_CLASS - V$SESSION_EVENT 와 동일한 차원의 값을 클래스 기준으로 제공
V$EVENT_HISTOGRAM - 각 대기 이벤트에 대해서 대기 시간의 구간(버킷) 별로 대기회수 보여줌
2) 기타 중요 다이나믹 뷰
대기 현상을 분석하기 위해서는 아래와 같은 다양한 다이나믹 뷰들을 활용할 수 있어야 한다.
V$SESSION : 세션 정보
V$ACTIVE_SESSION_HISTORY : 세션 히스토리 정보
V$PROCESS : 프로세스 정보
V$TRANSACTION : 트랜잭션 정보
V$LATCH, V$LATCH_PARENT, V$LATCH_CHILDREN, V$LATCH_HOLDER : 래치 정보
V$LOCK, V$LOCKED_OBJECT, V$ENQUEUE_LOCK : 락 정보
V$SQL : SQL 정보
V$LIBRARYCACHE, X$KGLLK, X$KGLPN : Library Cache 정보
V$ROWCACHE, V$ROWCACHE_PARENT : Row Cache 정보
V$SGASTAT : SGA 정보
V$SEGMENT_STATISTICS : 세그먼트 레벨 통계 정보
V$SESS_TIME_MODEL, V$SYS_TIME_MODEL : Time Model 정보
V$BH, X$BH : 버퍼 캐시 정보
V$ACTIVE_SESSION_HISTORY(ASH) - 10g 에서 도입된 Automatic Workload Repository (AWR) 기능의 일부로
Active 세션의 이력을 저장, Shared Pool 의 ASH buffers 영역에 저장된다.
V$SEGMENT_STATISTICS - 인스턴스가 가동된 후 의 세그먼트 단위의 통계치를 제공하는 뷰로
V$SYSSTAT 이나 V$SESSTAT 뷰로는 얻을 수 없는 중요한 정보 제공한다.
3) Extended SQL Trace
SQL Trace 는 SQL 튜닝 뿐만 아니라 대기현상을 분석하는데도 유용한 툴이다.
최근에 확장된 기능을 제공하는 이유로 Extended SQL Trace 라고 부른다.
기본적으로 10046 진단 이벤트를 통해 활성화되며, 다음과 같은 네가지 레벨로 제어할 수 있다.
LEVEL 1 - SQL 문장의 실행정보 (Parse, Execute, Fetch 단계와 Row source operation 결과) 만을 제공한다.
LEVEL 4 - LEVEL 1 + 바인드 변수 값을 제공한다.
LEVEL 8 - LEVEL 1 + 대기정보를 제공한다.
LEVEL 12 - LEVEL 4 + LEVEL 8, 즉 SQL문장의 실행정보와 바인드 변수값, 대기정보를 제공한다.
4) oradebug 와 dump
oradebug 툴과 dump 파일들은 비록 OWI 와 직접적인 관계는 없지만 대기현상들을 분석하고 이해하는데 매우 유용한 툴들이다.
- 진단이벤트 수행
- 덤프 수행
- 프로세스 제어
5) Automatic Workload Repository
10g 부터 도입된 AWR 은 가장 미약했던 오라클 성능이력관리 부분을 크게 강화시킨 것이다.
수집된 데이터는 DBA_HIST_XXXX 뷰를 통해 조회가능하다.
AWR 이 수집하는 데이터들은 다음과 같다.
- Active Session History
- 부하가 큰 문장
- 시스템 레벨과 세션 레벨에서 Time Model 통계
- 세그먼트와 기타 데이터베이스 객체에 대한 사용 통계치
- V$SESSTAT, v$SYSSTAT, V$SYSTEM_EVENT, V$SESSION_EVENT
4. OWI 데이터 수집
실시간 데이터만으로 성능문제를 완벽하게 분석할 수 없기 때문에 반드시 성능 이력 정보를 보관할 수 있어야 한다.
1) Logoff Trigger
세션이 로그오프될 때 V$SESSION_EVENT, V$SESSTAT 뷰 등을 캡쳐해서 저장하는 기법으로, 단순한 세션을 제외하고는 의미가 없다.
2) SQL 을 이용한 주기적인 수집
수집주기가 길다는 약점이 있고, 심각한 성능문제가 생긴 경우에는 수집을 위한 SQL 문장 자체가 실행되지 않기 때문에 장애분석용으로 사용할 수 없다.
3) Automatic Workload Repository (AWR)
SQL 을 이용한 주기적인 수집보다는 훨씬 가볍고 안정적이지만 데이터를 저장하는 방식으로 인해 수집주기를 필요한만큼 짧게 할 수 없다.
4) Direct Memory Access (DMA)
오라클이 SGA 영역을 직접 액세스 해서 필요한 데이터를 수집하는 기법이다.
AWR 과 달리 데이터를 원하는 주기로 저장할 수 있기 때문에 가장 유연하고 강력한 기법이다.
5. 기타
이해하기 위해 알아야 할 추가적인 내용
1) PL/SQL
간단한 PL/SQL, dbms_output, dbms_rowid, dbms_job 과 같은 패키지의 사용법에 대해서 어느 정도 이해할 수 있어야 한다.
2) 스크립트들
show_space
Thomas Kyte 가 작성한 스크립트로 특정 세그먼트의 공간 사용정도를 한눈에 보여준다.
print_table
역사 Thomas Kyte 가 작성한 스크립트로 테이블을 세로로 출력하는 기능을 제공한다.
기타 스크립트
- my_sess_event.sql : 현재 세션의 V$SESSION_EVENT 뷰 결과를 구한다.
- show_param.sql : 히든 파라미터까지 포함한 파라미터 값을 보여준다.
- system_event.sql : 시스템 전체의 대기현황을 V$SYSTEM_EVENT 뷰에서 구한다.
- sesstat.sql : 현재 세션의 V$SESSTAT 뷰의 결과를 구한다.
- undosize.sql : 현재 트랜잭션의 언두 데이터 정보를 얻는다.