테마
진단 도구 4열 대응표 — AWR ↔ ASH ↔ ADDM ↔ Statspack (템플릿)
17화에서 제정했다(1판). 시스템 전체를 진단할 때는 도구보다 질문을 먼저 고른다. 질문마다 답할 수 있는 칸과 답할 수 없는 칸이 다르다. T5 시스템 성능 리포트를 쓸 때 옆에 둔다. T5의 3번(9칸)은 AWR이, 5번(구간 안의 시간 분포)은 ASH가, 4번(권고)은 ADDM이 채운다. 팩이 없는 현장에서는 Statspack이 3번을 채우고, 5번은 스냅샷 간격으로 대신한다.
왜 이 문서가 있는가
16화 T5-001 (AWR 한 시간 한 장) "락은 한 시간의 5.5 % — 부차적"
조민우 (정산 현업) "6/17 10시 반에 정말로 화면이 다 멈췄어요. 5분쯤."17화(7월 1일)에 같은 한 시간을 다시 만들어 네 도구로 나란히 봤다.
17화 실측 (ora-hanorder · 같은 한 시간 · 3세션 · 10:30 ~ 10:35에 블로킹 체인 5분) | 그 도구에서 읽은 것 |
|---|---|
| AWR 한 시간 | enq: TX 5.5% · 평균 702ms · 행 락의 88%는 SYS 통계 테이블 · 그 SQL은 목록에 없다 |
| ASH (10초 · 1초 표본) | 10:30 ~ 10:35 enq: TX 100% · 평균 활성 세션 2.00 · CPU 0% · 막은 세션 = 세션 1(그 5분 동안 표본 0. 쉬면서 락을 쥐고 있었다) |
| ADDM 한 시간 | 1위 Sequence Usage 88%(근거가 다른 칸과 맞지 않아 기각) · 4위 Row Lock Waits 6.24% · Rationale에 막은 세션의 SID · SERIAL#(채택) |
| Statspack (팩 없음) | 한 시간 enq: TX 5.7%(AWR과 같은 평균) · 5분 스냅샷 99.5% |
도구 하나만 들고 가지 말고, 질문을 들고 가서 그 질문에 답할 수 있는 칸을 고른다.
대응표 (1판)
A. 무엇을 남기나
| AWR | ASH | ADDM | Statspack | |
|---|---|---|---|---|
| 남기는 것 | 누적 계량기의 스냅샷. 리포트는 두 스냅샷의 뺄셈 | 활성 세션의 순간 사진. 1초에 한 번 | 두 스냅샷 사이를 분석한 과제(Finding · Recommendation) | 누적 계량기의 스냅샷. 리포트는 뺄셈 |
| 해상도 | 스냅샷 간격(기본 1시간 · 수동 스냅샷) | 메모리 1초 · 디스크 10초 | 스냅샷 구간 | 스냅샷 간격(직접 찍거나 spauto 잡) |
| 어디에 · 얼마나 | SYSAUX · 보존(기본 8일) | 메모리 ASH buffers(고리 버퍼. 17화 DB는 4MB여서 3세션 한 시간 분량이 다 들어가지 않는다) · 디스크 10개에 1개 · AWR 보존 | SYSAUX(DBA_ADVISOR_*) | PERFSTAT 스키마(17화에서 132.8MB로 시작) · 지울 때까지(sppurge) |
| 얻는 함수 · 스크립트 | AWR_REPORT_TEXT · awrrpt.sql | V$ACTIVE_SESSION_HISTORY · DBA_HIST_ACTIVE_SESS_HISTORY · ASH_REPORT_TEXT · ashrpt.sql | DBMS_ADDM.ANALYZE_DB · GET_REPORT · addmrpt.sql · 스냅샷마다 자동 | STATSPACK.SNAP · spreport.sql |
| 팩 | 진단 팩 | 진단 팩 | 진단 팩 | 필요 없음 |
| 멀티테넌트 (이 버전 실측) | 루트 리포트에 9칸이 다 있다(16화) | PDB에서도 그 PDB의 표본이 보인다 · PDB 안의 디스크 표본은 DBID로 거른다 | 루트에서 | PDB에만 설치 · 리포트(루트 미지원) |
B. 질문 → 칸
| 질문 | AWR | ASH | ADDM | Statspack |
|---|---|---|---|---|
| 얼마나 바빴나 | DB Time ÷ Elapsed | 표본 × 간격 ÷ 구간 | Activity: 평균 활성 세션 | DB time ÷ Elapsed · Av Act Sess |
| 시간이 어디로 갔나 | Top Foreground Events · Time Model | 표본의 EVENT · SESSION_STATE 분포 | Finding의 Impact | Top 5 Timed Events |
| 언제 | ✗ 구간 평균뿐(리포트 뒤쪽 ASH 절은 ASH의 칸) | ○ 분 · 초 · 원하는 칸 | ✗ 구간 평균뿐 | 스냅샷 간격만큼. 미리 좁혀 둔 만큼만 |
| 누가 누구를 막았나 | ✗ Segments by Row Lock Waits는 횟수 | ○ BLOCKING_SESSION · SERIAL# (막은 쪽이 쉬었으면 이름만) | Rationale에 막은 세션의 SID · SERIAL# | ✗ |
| 어느 SQL | SQL ordered by: 누적 기준 상위만(Captured %) | 표본의 SQL_ID · TOP_LEVEL_SQL_ID | Top SQL Finding | SQL ordered by (level 5 이상) |
| 어느 객체 | Segments by … (횟수 · 블록) | CURRENT_OBJ#(대기 클래스가 Application · Concurrency · Cluster · User I/O일 때만) | Related Object | Segments (level 7) |
| 어느 프로그램 · 화면 | (SQL의 MODULE · ACTION) | MODULE · ACTION · CLIENT_ID · PROGRAM | (Rationale) | — |
| 무엇을 해야 하나 | ✗ | ✗ | ○ 가설(Rationale을 표본으로 다시 센 뒤에 채택) | ✗ |
| 지나간 뒤에 칸을 다시 자를 수 있나 | ✗ | ○ (보존 기간 동안) | ✗ | ✗ |
| 짧고 잦은 일 (수 µs × 수백 번) | ○ 횟수와 시간을 다 센다 | ✗ 표본에 거의 남지 않는다 | — | ○ |
C. 함정 (17화 실측)
| 도구 | 함정 | 실측 |
|---|---|---|
| AWR | 평균: 분자가 몰려 있어도 분모는 구간 전체 | enq: TX 599초 ÷ 3,600 = 5.5% · 그 599초는 300초 안에 몰려 있다 |
| AWR | 두 무리의 평균: Avg Wait | 853번 평균 702ms = 10초 × 60 + 4ms 미만 × 793 · Wait Event Histogram을 같이 본다 |
| AWR | 횟수와 시간 | Row Lock Waits 88%(횟수). 시간은 0초 |
| ASH | 막은 쪽이 Idle이면 표본이 없다 | 폭발 5분 동안 0장 · ASH 리포트 BLOCKING SESSION NOT FOUND |
| ASH | 메모리는 고리라서 곧바로 보지 않으면 덮인다 | 62분 런이 끝난 순간 메모리에 남은 가장 오래된 표본이 런 14~15분째 |
| ASH 리포트 | l_data_src를 빼면 메모리와 디스크를 이어 붙이다가 에러 없이 틀린 리포트가 나온다 | 표본 313 · AAS 0.87 / 267 · 0.74 · enq: TX 없음(두 번). 한 시간은 l_data_src => 2 |
| ASH 리포트 | 벽시계 5분 칸이 폭발을 둘로 자른다. 칸마다 1등이 바뀐다 | 같은 5분이 세 런에서 30 + 30(두 칸 다 1등은 CPU) · 50 + 10 · 4 + 55 |
| ADDM | Impact도 구간 평균이다. 순위로 중요도를 정하지 않는다 | Row Lock Waits 4~5위 · 그 5분에는 AAS 2.00 |
| ADDM | 다른 칸과 맞지 않는 칸에서 1위가 나올 수 있다 | Sequence Usage = Time Model sequence load(깃발이 켜진 채) · 권고를 따라도 그대로 |
| Statspack | AWR과 같은 평균의 함정 · ASH가 없다 | 한 시간 5.7%. 5분 스냅샷이면 99.5% |
NONE | 막아 주지 않는다. 새로 모으는 것만 멈춘다 | ADDM ORA-13716 · ASH 표본 0 · SQL Monitor 0 / AWR · ASH 리포트 · DBA_HIST 조회는 된다(그래도 위반) |
D. 읽는 순서 (17화)
1 AWR 한 시간 — 얼마나 · 어디로 (16화 9칸) ← 결론을 내지 않는다. 질문을 만든다
2 ASH 시간 축 — 언제 · 누가 · 누구를 (분 · 5분 · 블로킹 체인)
3 ADDM — 권고 = 가설. Rationale 을 2 의 표본으로 다시 센다. 맞지 않는 칸에서 나온 Finding 은 기각
4 아는 것과 대조 — 애플리케이션 · 배치 · 현업의 시각 (16화 ⑨)
팩이 없으면 — 1 = Statspack · 2 = 미리 좁혀 둔 스냅샷 간격 · 주기적으로 남긴 블로킹 트리 (12화 T4 1호 재발방지 3번) · 3 없음쓰는 법 — 질문마다 한 줄
| 질문 | 고른 칸 (도구 · 칸 이름) | 그 칸에서 읽은 것 | 다른 칸에서도 같은 결과가 나오나 | 결론에 쓰나 |
|---|---|---|---|---|
꼭 채워야 하는 열은 '다른 칸에서도 같은 결과가 나오나'다. 한 도구의 한 칸만으로 낸 결론은 16화의 T5-001처럼 근거가 있는데도 틀릴 수 있다.
금지어
"AWR을 보니 락은 부차적": 언제인지 보기 전에는 쓰지 않는다. 한 시간 중 몇 %인지와 가장 나쁜 5분 중 몇 %인지를 나란히 적는다. "ADDM이 권고했으니": Rationale을 표본으로 다시 센 결과부터 적는다. "팩이 없어서 막혀 있으니 괜찮다": NONE은 막지 않는다. 계약이 없는 서버에서는 DBA_HIST_*도 열지 않는다.
자매 문서
- T5 시스템 성능 리포트: 16화 제정 · 17화 개정(2호 = 교차검증판)
- T7 워크로드 프로파일: 16화 제정
- T4 장애 포스트모템: 12화 제정(블로킹 트리 ·
V$LOCK, 지금 찍는 법)
개정 이력: 17화에 제정했다(1판: 같은 한 시간을 세 번 돌린 실측). 18화에 사내 튜닝 표준 제1조의 근거와 세칙(질문 셋, '몇 분'을 기각하지 않는다)으로 올라갔다. 표는 그대로 쓴다.