TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-08-14 |
제목 | HANG과 SPIN의 구분 | ||
---|---|---|---|
HANG과 SPIN의 구분
====================== Explanation ----------- 1. 용어 정의 hanging : 아무런 작업도 일어나지 않는 상태 spinning: 상당한 양의 시스템 자원을 사용하면서도 아무런 의미가 없는, 특정한 작업이 loop 안에서 반복되는 상태 2. 구분 방법 hang과 spin을 구분하기 위해서 먼저 v$session_wait 을 참조해야 한다. v$session_wait로 현재 상태에서 어떤 세션이 waiting 상태에 있는지를 조회할 수 있다. 다음은 v$session_wait을 조회하는 예이다. SELECT sid,seq#,event,p1,p2,p3,wait_time FROM v$session_wait; 위 SQL 문장은 최소한 3번 이상 실행 한 후 결과를 비교해 보아야 한다. 컬럼의 의미 sid 세션의 System IDentifier seq# Sequence number. 이 값은 특정 세션에서 새로운 wait 이벤트가 발생할 때 마다 증가된다. 이 값을 서로 다른 시점에서 비교해 보면 세션에서 작업이 진행중인지 여부를 알 수 있다. event 세션에서 wait 하고 있거나, 이전에 마지막으로 wait 했던 operation p1 p2 p3 이 컬럼들은 event별로 서로 다른 내용을 나타낸다. wait_time 값이 0일 경우 세션이 특정 event를 wait 하고 있는 것을 나타낸다. 0이 아닌 값일 경우 세션이 이전에 wait 했던 마지막 event를 나타낸다. 3. 진단 방법 정상적인 상황에서는 세션에서 다른 operation을 실행 할 때 마다 v$session_wait 컬럼 값이 계속 변하게 된다. Hang이 발생한 상황에서는, 문제가 되는 세션에서 더이상 작업이 진행되지 않고 프로세스에서 시스템 자원(메모리, CPU ...)을 사용하지 않는 상태가 된다. 일반적으로 서버에서 특정한 event를 waiting 하고 있을 경우, event가 발생하면 세션에서 추가 작업이 지속될 수 있다. 하지만 어떤 이유에서건 waiting 하고 있는 event가 발생하지 않을 경우에는 hang 상태를 유발시킬 수 있다. Hang이 발생하였다면 waiting 하고 있는 event를 찾아 내어 어떤 조치를 취해야 할 지 판단하여야 한다. 예를 들어 세션에서 disk에 write를 끝내는 event에 대해 waiting 하고 있을 경우 왜 writing이 오랜시간동안 끝나지 않는지를 밝혀내야 한다. Spin이 발생하는 상황에서는 컬럼 값이 변하지 않을 수도 있고 계속 변할 수도 있으며, 이것은 spin이 발생하는 상황에 따라 다르다. Spin이 발생하는 상황에서는 CPU나 메모리등의 자원을 계속 사용하게 된다. 특정 세션에서 spin이 발생하는 상황에서는 code 레벨에서 어떤 부분에서 spin이 발생 하는지를 판단하는 것이 중요하다. 관련 정보를 얻기 위해서는 event 값을 참조할 수도 있지만, 일반적으로 문제가 발생된 프로세스에 대한 errorstack을 발생시켜, 지원을 받는 것이 바람직하다. 4. V$SESSION_WAIT 조회 예제 다음은 SQL*Plus에서 실행시킬 수 있는 script의 예제이다. column sid format 990 column seq# format 99990 column wait_time heading 'WTime' format 99990 column event format a30 column p1 format 9999999990 column p2 format 9999999990 column p3 format 9990 select sid,event,seq#,p1,p2,p3,wait_time from V$session_wait / Sample Output: SID EVENT SEQ# P1 P2 P3 WTime ---- ------------------------------ ------ ----------- ----------- ----- ------ 9 Null event 347 0 300 0 0 10 Null event 344 0 300 0 0 11 Null event 343 0 300 0 0 12 Null event 342 0 300 0 0 1 pmon timer 335 300 0 0 0 2 rdbms ipc message 779 300 0 0 0 3 rdbms ipc message 8 30000 0 0 0 4 rdbms ipc message 484 300 0 0 0 8 rdbms ipc message 1 500 0 0 0 7 rdbms ipc message 14 180000 0 0 0 5 rdbms ipc message 335 300 0 0 0 6 smon timer 74 300 0 0 0 16 SQL*Net message from client 1064 1650815315 1 0 -1 다음은 svrmgrl에서의 실행 예제이다. SVRMGR> select sid,event,seq#,p1,p2,p3,wait_time from V$session_wait; SID EVENT SEQ# P1 P2 P3 WAIT_TIME ---------- -------------- ---------- ---------- ---------- ---------- ---------- 9 Null event 503 0 300 0 0 10 Null event 501 0 300 0 0 11 Null event 500 0 300 0 0 12 Null event 499 0 300 0 0 1 pmon timer 491 300 0 0 0 2 rdbms ipc mess 935 300 0 0 0 3 rdbms ipc mess 9 30000 0 0 0 4 rdbms ipc mess 640 300 0 0 0 8 rdbms ipc mess 1 500 0 0 0 7 rdbms ipc mess 14 180000 0 0 0 5 rdbms ipc mess 491 300 0 0 0 6 smon timer 81 300 0 0 0 16 SQL*Net messag 74 1650815315 1 0 1 |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |