참고 자료
http://www.oracle.com/technology/global/kr/pub/articles/10gdba/index.html
코어 스터디 : 강정식님 스터디 자료
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SELECT WAIT_CLASS,
NAME,
PARAMETER1,
PARAMETER2,
PARAMETER3
FROM V$EVENT_NAME
ORDER BY WAIT_CLASS,
NAME
;
vmstat 1 1000
-* 서버의 가상 메모리 통계정보를 보기위한 명령어
-* vmstat 명령은 커널 스레드, 가상 메모리, 디스크, 트랩 및 CPU 활동에 대한 통계를 보고함.
-* vmstat 명령으로 작성된 보고서는 시스템 로드 활동의 균형을 유지하는 데 사용될 수 있으며
이 시스템 전반에 대한 통계(모든 프로세서 중에서의 통계)는 비율로 표시된 값의 평균 또는 합계로 계산됨.
-* 구문
vmstat [ -f ] [ -i ] [ -s ] [ -I ] [ -t ] [ -v ] [ -w] [ -l ] [ { -p | -P } pagesize | ALL ] ALL ] [ PhysicalVolume ... ] [ Interval [ Count ] ]
-t : 출력의 각 행 다음에 시간 소인을 출력하며 시간 소인은 HH:MM:SS 형식으로 표시됨
60 : 60초 간격으로 출력하도록 함
1000 : 한번에 1000개의 로우를 출력하도록 함
r | b | avm | fre | re | pi | po | fr | sr | cy | in | sy | cs | us | sy | id | wa | hr mi se |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 24 | 3132936 | 2000 | 0 | 0 | 0 | 5186 | 27716 | 0 | 5546 | 40941 | 14037 | 40 | 6 | 8 | 45 | 08:48:06 |
7 | 26 | 3137616 | 2062 | 0 | 1 | 0 | 7389 | 47361 | 0 | 5787 | 42744 | 17656 | 41 | 8 | 8 | 43 | 08:49:06 |
9 | 33 | 3145090 | 2081 | 0 | 1 | 0 | 7047 | 37573 | 0 | 5813 | 57915 | 20228 | 43 | 9 | 5 | 44 | 08:50:06 |
7 | 55 | 3140985 | 9712 | 0 | 1 | 0 | 9142 | 51835 | 0 | 8203 | 39344 | 20428 | 37 | 9 | 2 | 52 | 08:51:06 |
7 | 52 | 3152171 | 2001 | 0 | 1 | 0 | 8396 | 51356 | 0 | 7999 | 40604 | 20296 | 36 | 9 | 2 | 53 | 08:52:06 |
대분류 | 소분류 | 설명 |
---|---|---|
kthr | r | 현재 일을 수행 중이거나 runnable queue에서 CPU 리소스를 기다리는 프로세스 개수 |
b | 샘플 간격을 통해 VMM 대기행렬에서 대기 중인 커널 스레드의 평균 개수(대기 중인 자원, 대기 중인 입출력) | |
memory | avm | 사용 중인 가상 페이지 |
fre | 사용 가능 리스트의 크기(실제 메모리의 많은 부분이 파일 시스템 데이터를 위한 캐쉬로 이용되며 사용 가능 리스트 크기의 양이 적게 남는 일은 드뭄) | |
page | re | 호출기 입출력 리스트 |
pi | 페이징 공간에서 들어오는 페이지 | |
po | 페이징 공간으로 나가는 페이지 | |
fr | 사용 가능 페이지(페이지 교체) | |
sr | 페이지 교체 알고리즘에 의해 스캔되는 페이지 | |
cy | 페이지 교체 알고리즘에 의한 시간 주기 | |
faults | in | 장치 인터럽트 |
sy | 시스템 호출 | |
cs | 커널 스레드 문맥 전환 | |
cpu | us | 사용자 시간 |
sy | 시스템 시간 | |
id | CPU 유휴 시간 | |
wa | 시스템이 미결 디스크/NFS 입출력 요청을 보유하는 동안의 CPU 유휴 시간 | |
time | hr mi ss | 시분초 |
1. 자신이 필요로 하는 특정 리소스가 다른 프로세스에 의해 사용중일 때
2. 다른 프로세스에 의해 선행작업이 완료되기를 기다릴 때
3. 할 일이 없을 때(idle 대기 이벤트)
SQL> conn sys/sys@erm as sysdba
연결되었습니다.
SQL> drop table t1 purge;
테이블이 삭제되었습니다.
SQL> create table t1(c1 int, c2 varchar2(10));
테이블이 생성되었습니다.
SQL> insert into t1
2 select level, 'AAA'
3 from dual
4 connect by level < 10000
5 ;
9999 개의 행이 만들어졌습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> update t1 set c2 = 'SESSION1' where c1 = 1;
1 행이 갱신되었습니다.
SQL> select * from t1 where c1 = 1;
C1 C2
---------- ----------
1 SESSION1
SQL> column wait_class format a10
SQL> column event format a50
SQL> column sid format 999999
SQL> column state format a10
SQL> column wait_time format 999999
SQL> column seconds_in_wait format 999999
SQL> set linesize 20000
SQL> select wait_class, event, sid, state, wait_time, seconds_in_wait
2 from v$session_wait
3 order by wait_class, event, sid
4 ;
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle SQL*Net message from client 135 WAITING 0 2975
Idle SQL*Net message from client 137 WAITING 0 0
Idle SQL*Net message from client 140 WAITING 0 1
Idle SQL*Net message from client 145 WAITING 0 12
Idle SQL*Net message from client 158 WAITING 0 6
Idle Streams AQ: qmn coordinator idle wait 154 WAITING 0 172184
Idle Streams AQ: qmn slave idle wait 149 WAITING 0 736
Idle Streams AQ: waiting for messages in the queue 143 WAITING 0 1
Idle Streams AQ: waiting for time management or cleanup 152 WAITING 0 10717
tasks
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle jobq slave wait 157 WAITING 0 5
Idle pmon timer 170 WAITING 0 86538
Idle rdbms ipc message 160 WAITING 0 26924
Idle rdbms ipc message 161 WAITING 0 382
Idle rdbms ipc message 162 WAITING 0 6
Idle rdbms ipc message 163 WAITING 0 170390
Idle rdbms ipc message 165 WAITING 0 0
Idle rdbms ipc message 166 WAITING 0 0
Idle rdbms ipc message 167 WAITING 0 24
Idle rdbms ipc message 168 WAITING 0 87533
Idle rdbms ipc message 169 WAITING 0 3
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle smon timer 164 WAITING 0 5
Idle wait for unread message on broadcast channel 144 WAITING 0 18
Network SQL*Net message to client 142 WAITED SHO -1 0
RT TIME
23 개의 행이 선택되었습니다.
SQL> -- 대기 이벤트가 발생하지 않음
SQL> -- SESSION2에 해당 로우에 업데이트(아직 SESSION1 커밋 전 상황) 위 사황..
SQL> select wait_class, event, sid, state, wait_time, seconds_in_wait
2 from v$session_wait
3 order by wait_class, event, sid
4 ;
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Applicatio enq: TX - row lock contention 141 WAITING 0 30
n
Idle SQL*Net message from client 137 WAITING 0 9
Idle SQL*Net message from client 140 WAITING 0 260
Idle SQL*Net message from client 145 WAITING 0 19
Idle SQL*Net message from client 158 WAITING 0 51
Idle Streams AQ: qmn coordinator idle wait 154 WAITING 0 172443
Idle Streams AQ: qmn slave idle wait 149 WAITING 0 995
Idle Streams AQ: waiting for messages in the queue 143 WAITING 0 3
Idle Streams AQ: waiting for time management or cleanup 152 WAITING 0 10976
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
tasks
Idle jobq slave wait 135 WAITING 0 4
Idle pmon timer 170 WAITING 0 86797
Idle rdbms ipc message 160 WAITING 0 27183
Idle rdbms ipc message 161 WAITING 0 203
Idle rdbms ipc message 162 WAITING 0 6
Idle rdbms ipc message 163 WAITING 0 170649
Idle rdbms ipc message 165 WAITING 0 0
Idle rdbms ipc message 166 WAITING 0 3
Idle rdbms ipc message 167 WAITING 0 12
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle rdbms ipc message 168 WAITING 0 87792
Idle rdbms ipc message 169 WAITING 0 3
Idle smon timer 164 WAITING 0 264
Idle wait for unread message on broadcast channel 144 WAITING 0 6
Network SQL*Net message to client 142 WAITED SHO -1 0
RT TIME
23 개의 행이 선택되었습니다.
SQL> --TX - row lock contention 발생
SQL> select BLOCKING_SESSION_STATUS, BLOCKING_SESSION
2 from v$session
3 where sid = 141;
BLOCKING_SE BLOCKING_SESSION
----------- ----------------
VALID 142
SQL> -- SID 142가 141을 블록킹 하고있음
SQL> -- 얼마나 많은 wait가 발행 하는가?
SQL> select * from v$session_wait_class where sid = 141;
SID SERIAL# WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED
------ ---------- ------------- ----------- ---------- ----------- -----------
141 60280 4217450380 1 Applicatio 106 31199
n
141 60280 2723168908 6 Idle 7 3944
141 60280 2000153315 7 Network 7 0
SQL> --어플리케이션에 관련된 세션 Wait이벤트가 106회 31199에 걸쳐 발생됨
SQL> --이 방법을 응용하여, wait class에 관련한 시스템의 전반적인 통계를 확인할 수도 있습니다. (여기
에서도 시간은 centi-second 단위로 표시됩니다.)
SQL> select * from v$system_wait_class;
WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED
------------- ----------- ---------- ----------- -----------
1893977003 0 Other 1034683 13542
4217450380 1 Applicatio 17474 555960
n
3290255840 2 Configurat 546 3703
ion
3875070507 4 Concurrenc 4093 3650
y
3386400367 5 Commit 17357 9358
WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED
------------- ----------- ---------- ----------- -----------
2723168908 6 Idle 5261123 387553551
2000153315 7 Network 260698 87
1740759767 8 User I/O 16560 41880
4108307767 9 System I/O 3256439 130560
9 개의 행이 선택되었습니다.
SQL> -- 문제의 패텬마 암시할뿐 정확한 패턴 조회는 wait class의 히스토리 뷰를 조회해야 한다.
SQL> --V$WAITCLASSMETRIC 뷰는 지난 1분 동안의 wait class 통계를 제공합니다.
SQL> select wait_class#, wait_class_id,
2 average_waiter_count "awc", dbtime_in_wait,
3 time_waited, wait_count
4 from v$waitclassmetric
5 /
WAIT_CLASS# WAIT_CLASS_ID awc DBTIME_IN_WAIT TIME_WAITED WAIT_COUNT
----------- ------------- ---------- -------------- ----------- ----------
0 1893977003 0 0 0 0
1 4217450380 .99997805 99.9242408 5999.8683 24
2 3290255840 0 0 0 0
3 4166625743 0 0 0 0
4 3875070507 .000119233 .011914562 .7154 1
5 3386400367 .000062167 .006212093 .373 3
6 2723168908 16.7111041 0 100266.624 371
7 2000153315 2.3833E-06 .000238158 .0143 56
8 1740759767 0 0 0 0
9 4108307767 .000602167 .060172368 3.613 26
10 2396326234 0 0 0 0
WAIT_CLASS# WAIT_CLASS_ID awc DBTIME_IN_WAIT TIME_WAITED WAIT_COUNT
----------- ------------- ---------- -------------- ----------- ----------
11 3871361733 0 0 0 0
12 개의 행이 선택되었습니다.
--1분동안 4217450380 WAIT_CLASS_ID값을 갖는 WAIT CLASS를 0.9개의 세션이 총 24회 5999 5999 centi-secondd에 걸쳐 대기했음을 알수있다.
-- 아래는 wait 이벤트가 종료된 상황에는 더이상 남아있지않음 이럴경우는 10g는 session wait 히스토리 정보를 자동 저장하고 관리하며, 이 결과는 V$SESSION_WAIT_HISTORY 뷰를 통해 조회할수 있다.
SQL> select event, wait_time, wait_count
2 from v$session_wait_history
3 where sid = 141
4 /
EVENT WAIT_TIME WAIT_COUNT
-------------------------------------------------- --------- ----------
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
enq: TX - row lock contention 300 1
10 개의 행이 선택되었습니다.
--세션이 inactive 상태가 되거나 연결이 끊어진 경우, 관련된 기록도 뷰에서 삭제됩니다. 하지만 히스토리 정보는 AWR 테이블에 별도로 저장됩니다. AWR의 V$ACTIVE_SESSION_HISTORY 뷰는 session wait에 관련한 정보를 제공합니다.
update t1 set c2 = 'SESSION2' where c1 = 1
1. 대기 상태에 빠진 프로세스가 기다리던 리소스를 사용할 수 있게 될 경우
2. 작업을 계속 진행하기 위한 선행작업이 완료될 경우
3. 해야 할 일이 생겼을 경우
...
SQL> commit;
커밋이 완료되었습니다.
SQL> select wait_class, event, sid, state, wait_time, seconds_in_wait
2 from v$session_wait
3 order by wait_class, event, sid
4 ;
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle SQL*Net message from client 137 WAITING 0 0
Idle SQL*Net message from client 140 WAITING 0 26
Idle SQL*Net message from client 141 WAITING 0 37
Idle SQL*Net message from client 158 WAITING 0 112
Idle Streams AQ: qmn coordinator idle wait 154 WAITING 0 181329
Idle Streams AQ: qmn slave idle wait 149 WAITING 0 6797
Idle Streams AQ: waiting for messages in the queue 143 WAITING 0 1
Idle Streams AQ: waiting for time management or cleanup 152 WAITING 0 19862
tasks
Idle jobq slave wait 135 WAITING 0 50
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle pmon timer 170 WAITING 0 95683
Idle rdbms ipc message 160 WAITING 0 36069
Idle rdbms ipc message 161 WAITING 0 527
Idle rdbms ipc message 162 WAITING 0 67
Idle rdbms ipc message 163 WAITING 0 179535
Idle rdbms ipc message 165 WAITING 0 0
Idle rdbms ipc message 166 WAITING 0 0
Idle rdbms ipc message 167 WAITING 0 7
Idle rdbms ipc message 168 WAITING 0 96678
Idle rdbms ipc message 169 WAITING 0 112
Idle smon timer 164 WAITING 0 2648
WAIT_CLASS EVENT SID STATE WAIT_TIME SECONDS_IN_WAIT
---------- -------------------------------------------------- ------ ---------- --------- ----------
Idle wait for unread message on broadcast channel 144 WAITING 0 22
Network SQL*Net message to client 142 WAITED SHO -1 0
RT TIME
22 개의 행이 선택되었습니다.
SQL> select event, wait_time, wait_count
2 from v$session_wait_history
3 where sid = 141
4 /
EVENT WAIT_TIME WAIT_COUNT
-------------------------------------------------- --------- ----------
SQL*Net message to client 0 1
SQL*Net message from client 0 1
SQL*Net message to client 0 1
SQL*Net message from client 4135 1
SQL*Net message to client 0 1
SQL*Net message from client 5 1
SQL*Net message to client 0 1
SQL*Net message from client 12 1
SQL*Net message to client 0 1
SQL*Net message from client 24 1
10 개의 행이 선택되었습니다.
-- ^^; 히스토리 뷰에는 남아있어야하는데 사라지는군요 ;;;
SQL> column addr format a20;
SQL> column latch# format 99999;
SQL> column level# format 99999;
SQL> column name format a50;
SQL> column get format 99999999999999;
SQL> column misses format 9999999999999;
SQL> column spin_gets format 99999999999999;
SQL> column sleeps format 9999999999;
SQL> set linesize 20000;
SQL>
SQL> SELECT *
2 FROM (SELECT ADDR,
3 LATCH#,
4 LEVEL#,
5 NAME,
6 GETS,
7 MISSES,
8 SPIN_GETS,
9 SLEEPS
10 FROM V$LATCH
11 ORDER BY 2)
12 WHERE ROWNUM <= 10
13 ;
ADDR LATCH# LEVEL# NAME GETS MISSES SPIN_GETS SLEEPS
-------------------- ------ ------ -------------------------------------------------- ---------- ---
03C3C050 0 8 event range base latch 0 0 0 0
03C3C0B8 1 8 post/wait queue 30366 0 0 0
03C3C120 2 0 hot latch diags 0 0 0 0
03C3C368 3 1 process allocation 8383 0 0 0
03C3C3D0 4 5 session allocation 92865706 5507 5496 11
03C3C440 5 0 session switching 3166 0 0 0
03C3C4A8 6 0 process group creation 8383 0 0 0
03C3C510 7 1 session idle bit 4341909 22 22 0
03C3C580 8 7 client/application info 91516 0 0 0
03C3CAB0 9 8 longop free list parent 313 0 0 0
10 개의 행이 선택되었습니다.
래치 관련 참고 사이트
http://wiki.gurubee.net/pages/viewpage.action?pageId=1343499
http://wiki.ex-em.com/index.php/Latch_free