\- 기존에 제공 되던 동적 성능 뷰(V$) 만으로는 문제를 빨리 찾기가 힘들었다.
\- SQL Trace로는 상세한 분석은 가능하나 시스템에 부하도 많이 가고, 분석 완료하는데 시간이 오래걸려 확인하려는 순간 상황이 종료 될 수 있다.
\- 기존의 성능분석으로 인한 어려움을 개선하고자 AWR의 ASH 기능이 나오게 되었다.
\- 별도의 모니터링 툴 없이 세션 레벨의 실시간 모니터링이 가능하게 되었다.
\- v$active_session_history 뷰를 이용해 ASH Buffer에 저장된 세션 정보를 조회할 수 있다.
\- 특징
: 현재 접속중인 Active 세션 정보를 1초에 한번씩 샘플링해서 ASH Buffers에 저장한다.
: SGA의 Shared Pool에 CPU당 2MB의 Buffer를 할당한다.
: 1시간 or Buffer의 2/3가 찰때 Disk에 기록한다. (AWR에 저장한다.=>SYSAUX Tablespace)
: 초단위로 쓰기가 발생하기 때문에 경합을 피하기 위해 Latch가 없다. (일관성이 잘못될 가능성이 있다.)
: 1/10만 샘플링해서 저장.(문제가 되는 대기 이벤트는 일정간격을 두고 지속적으로 발생하기 때문에 샘플링 된 자료만으로도 원인을 찾는데 큰 지장이 없다)
: v$active_session_history 뷰를 조회했을 때 정보가 찾아지지 않는다면 이미 AWR에 쓰여진 것으로 dba_hist_active_sess_history뷰를 조회하면 된다.
-- CPU 갯 수 별 ASH Buffers 의 크기 --
* 8cpu *
SQL> select * from v$sgastat where name ='ASH buffers';
POOL NAME BYTES
------------ -------------------------- ----------
shared pool ASH buffers 16777216
* 1cpu *
SQL> select * from v$sgastat where name ='ASH buffers';
POOL NAME BYTES
------------ -------------------------- ----------
shared pool ASH buffers 2097152
\- v$active_session_history 조회시 Wait Class가 Application, Concurrency, Cluster, User I/O 일 때만 의미 있는 값이다.
\- 예를 들어, ITL 슬롯 부족 때문에 발생하는 enq:TX - allocate ITL entry 대기 이벤트는 Configuration에 속하므로,v$active_session_history 뷰를 조회할 때 함께 출력되는 오브젝트에 Lock이 걸렸다고 판단해서는 안된다.
\- 대개 그럴 때는 오브젝트번호가 \-1로 출력되지만 직전에 발생한 이벤트의 오브젝트 정보가 계속 남아서 보이는 경우가 있으므로 잘못 해석하지 않도록 주의해야 한다.
(1) AWR 뷰를 이용해 하루 동안의 이벤트 발생현황을 조회해 본다.
(2) 특정 구간(08:15~09:15 )에서 enq: TM - contention 이벤트가 다량 발생한 것이 확인 되었다.
(2) dba_hist_active_sess_history를 조회해서 해당 이벤트를 많이 대기한 세션을 확인 한다.
(3) 블로킹 세션 정보를 통해 dba_hist_active_sess_history를 다시 조회한다.
(4) 블로킹 세션이 찾아지면 해당 세션이 그 시점에 어떤 작업을 수행 중이었는지 sql_id를 이용해 그 당시 SQL과 실행계획까지 확인 할 수 있다.(v$sql과 v$sql_plan까지 AWR에 저장되기 때문이다.)
(5) 해당 SQL문의 원인분석 후 해결책을 개발자 또는 개발팀 전체에 공지하여 문제를 해결토록 한다.