ASH(Active Session Histroy)
(1) ASH 등장 배경
이벤트 기반 분석과 Ratio 기반 분석의 문제점
- 시스템에 문제가 있는 것으로 진단되었을 때 그 원인을 찾아 실제 문제를 해결하는 데까지 많은 시간이 소모된다.
- 문제의 원인을 금방 알 수는 있지만, 실제 문제가 된 프로그램 또는 세션을 확인하는 별도의 작업이 필요
따라서 이러한 문제점을 보완하기 위한 기능이 바로 ASH이다.
(2) ASH 동작
- ASH는 Third Party 모니터링 도구 없이 오라클 내에서 세션 레벨로 실시간 모니터링한다.
- 오라클은 현재 접속해서 활동 중인 Active 세션 정보를 1초에 한번씩 샘플링해서 ASH 버퍼에 저장한다.
1. ASH buffer 확인
SQL> select * from v$sgastat where name = 'ASH buffers';
===================================================
POOL NAME BYTES
shared pool ASH buffers 8388608
===================================================
2. ASH 버퍼에 저장된 세션 히스토리 정보
select
sample_id, sample_time
, session_id, session_serial
, sql_id, sql_child_number, sql_plan_hash_value
, session_state
, qc_instance_id, gc_session_id
, blocking_session, blocking_session_serial
, event, event
, p1text, p1, p2text, p2, p3text, p3
, current_obj
, program, module, action, client_id
from V$ACTIVE_SESSION_HISTORY;
(3) ASH 예시
[예시1]
- 현재 발생 중인 대기 이벤트의 Wait Class가 Application, Concurrency, Cluster, User I/O 일 때만 의미 있는 값이다.
- 예제처럼 직전에 발생한 이벤트(enq:TX - allocate ITL entry)의 오브젝트 정보가 계속 남아서 보이는 경우가 있다.
column current_obj
column current_file
column current_block
select to_char(sample_time, 'hh24:mi:ss') sample_tm, session_state
, event, wait_class, current_obj
from v$active_session_history
where session_id = 143 and session_serial
order by sample_time;
========================================================================================
SAMPLE_T SESSION EVENT WAIT_CLASS CUR_OBJ
15:00:44 WATING enq: TX - row lock contention Application 55765 4 476
15:00:45 WATING enq: TX - row lock contention Application 55765 4 476
15:00:46 WATING enq: TX - row lock contention Application 55765 4 476
15:00:47 WATING enq: TX - row lock contention Application 55765 4 476
15:01:36 WATING enq: TX - allocate ITL entry Conficuration -1 4 476
15:01:37 WATING enq: TX - allocate ITL entry Conficuration -1 4 476
15:01:38 WATING enq: TX - allocate ITL entry Conficuration -1 4 476
15:01:39 WATING enq: TX - allocate ITL entry Conficuration -1 4
========================================================================================
[예시2] AWR과 ASH를 활용한 분석 예제 (오라클 10g부터)
v$active_session_history
정보를 AWR 내에 보관하므로 과거치에 대한 세션 레벨 분석이 가능하다.(1/10만 샘플링해서 저장)
[AWR과 ASH를 활용한 분석 예제]
- AWR 뷰를 이용해 하루 동안의 이벤트 발생현황을 조회하여 08:15~09:15 구간에서 enq: TM - contention 이벤트가 다량 발생했음을 확인한다.
dba_hist_active_sess_history
를 조회해서 해당 이벤트를 많이 대기한 세션을 확인한다.
- 블로킹 세션 정보를 통해
dba_hist_active_sess_history
를 다시 조회한다.
- 블로킹 세션이 찾아지면 해당 세션이 그 시점에 어떤 작업을 수행 중이었는지 확인한다.
- sql_id를 이용해 그 당시 SQL과 실행계획까지 AWR에서 확인한다.
- bloking 세션이 Append Mode Insert를 수행하면서 Exclusive 모드 TM Lock에 의한 경합이 발생했었음을 알 수 있다.
- program, module, action, client_id 등 애플리케이션 정보를 이용해 관련 프로그램을 찾아 Append 힌트를 제거한다.
- 다른 트랜잭션과 동시 DML이 발생할 수 있는 상황에서는 insert문에 Append 힌트를 사용해서는 안 된다는 사실을 개발팀 전체에 공지한다.