조회 수 23731 추천 수 0 댓글 1

CPU를 과도하게 차지하고 있는 SESSION과 SQL문 TRACKING
====================================================

STEP 1) CPU를 과도하게 차지하고 있는 Process의 PID를 확인한다.
        이것은 OS Utility(TOP 등)를 사용하여 확인할 수 있다.
        
SETP 2) 일단 PID를 확인하였으면 이 Process가 수행하고 있는 Session을 찾아야
        한다
    
       SQL> select a.sid, a.serial#
            from v$session a, v$process b
            where a.paddr= b.addr and b.spid= PID;
            
            위에서 PID는 step 1에서 확인한 OS의 PID를 기술한다.
            
            Session을 찾으면 v$session의 다른 column들을 통하여 현재
            이 session에 더 많은 정보를 알 수 있다.
            
            
STEP 3) Session을 찾았으면 이 Session 에서 어떠한 SQL문이 수행되는지를
        알아내야 한다.
        
        SQL> set long 10000
        SQL> select a.sql_text
             from v$sqltext a, v$session b
             where a.address=b.sql_address and
                   a.hash_value=b.sql_hash_value and
                   b.sid= 93470
             order by a.piece;
                  
             위에서 SID_NUMBER는 step 2에서 얻은 sid입니다.      
            
STEP 4) SQL문의 적합성을 판단

 

No. 12220

(WINDOWS2000)CPU를 많이 사용하는 SESSION KILL(V8.1.X이상)
========================================================

이 방법은 windows2000, oracle8i에서 적용할 수 있다.
oracle process가 cpu를 100% 사용하고 있을 때 unix인 경우 top이나 ps 등의
명령을 통해
어느 process가 cpu를 사용하는지 파악하여 pid를 얻고 이를 이용하여
v$session에서
sessionID를 찾아내서 어떤 sql을 사용하고 있는지도 파악할 수 있다.
그러나 windows2000에서는 background process와 server process가 thread로
존재하기 때문에 unix에서와는 다른 방법을 취해야 한다.


1. 어떤 thread가 cpu를 많이 사용하는지 파악한다.

시작-설정-제어판-관리도구-성능 아이콘을 선택하여 시스템 성능
모니터창을 연다.
여기서 현재동작보기 버튼을 마우스 오른쪽 버튼으로 클릭하여 카운터
추가라는 메뉴항목을 선택한다.

성능개체는 'Thread', 카운터선택은 '% processor Time', 인스턴스 선택은
관심이 있는 thread를 선택한다. 여기서 oracle 옆의 숫자는 threadID가 아니
고 단지 일련번호이다.

선택 후 추가버튼을 누르고 닫기버튼을 누르면 선택한 thread의 색깔별로 cpu
사용량을 알 수 있다.


2. thread ID를 확인

cpu를 많이 사용하는 thread가 oracle/15라면 이 thread의 threadID를
찾아낸다.
새카운터세트 버튼을 누르면 현재의 화면이 초기화된다.
다시 현재동작보기 버튼을 마우스 오른쪽 버튼으로 클릭하여 카운터 추가라는
메뉴항목을 선택한다.
이번에는 성능개체는 'Thread', 카운터선택은 'ID thread', 인스턴스 선택은
관심이 있는 thread(여기서는 oracle/15)를 선택한다. 추가, 닫기버튼을 누르
면 화면 하단의 '마지막','평균',…등의 항목에 예를 들어 1844.00처럼 숫자
가 나타난다.
이 숫자 1844가 thread ID이다.


3. session ID를 확인

이 thread ID를 이용하여 해당 session의 session ID를 확인할 수 있다.

select s.sid, s.serial# from v$session s, v$process p
where p.addr=s.paddr
and p.spid=1844;

여기서 조회된 sid로 해당 session이 작업 중인 내용을 알 수 있다.

select a.sql_text SQL
from v$sqltext a, v$session s
where a.address = s.sql_address
and a.hash_value = s.sql_hash_value
and s.sid=<조회된sid>
and s.serial#=<조회된 serial#>;

4. session kill

여기서 alter system kill session 명령을 이용하여 session을 죽일 수 있고
dos 창에서 다음 명령어를 이용하여 해당 thread를 직접 kill시킬 수 있다.

C:DOS> orakill <ORACLE SID> <thread ID>


    
No. 17480

(V8.X ~ V9.X) UNDO/REDO 를 많이 생성시키는 SESSION을 찾아주는 SQL 문
====================================================================

PURPOSE
-------

   이 자료는 운영 중인 Oracle 데이타베이스에서 Redo를 많이 생성시키는 
   session 정보를 순서 대로 출력해주는 SQL 문에 대한 자료이다.


Explanation
-----------

   다음 두 가지 SQL 문을 이용하면 Redo와 Undo를 많이 생성시키는
   session, transaction 정보를 알 수 있다.

   1) V$SESS_IO 뷰와 V$SESSION view를 조인한다. V$SESS_IO 뷰의
      BLOCK_CHANGES 라는 컬럼은 얼마나 많은 block들이 그 session에
      의해서 변화되었는지를 보여준다. 이 값이 높으면 session이
      많은 양의 redo를 생성시켰음을 알 수 있다.

      SQL> SELECT s.sid, s.serial#, s.username, s.program,
           i.block_changes
           FROM v$session s, v$sess_io i
           WHERE s.sid = i.sid
           ORDER BY 5 desc, 1, 2, 3, 4;

      위 SQL 문을 여러번 수행해서 BLOCK_CHANGES 값의 각 발생 사이의
      delta 값을 비교해보면, 그 값이 클 수록 그 session이 많은 양의
      redo를 생성시켰음을 알 수 있다.

   2) V$TRANSACTION 뷰를 조회하면 해당 transaction에 의하여 액세스된
      undo block과 undo record들의 양에 대한 정보를 알 수 있다.
      그 정보는 USED_UBLK 컬럼과 USED_UREC 컬럼을 보고 알 수 있다.

      SQL> SELECT s.sid, s.serial#, s.username, s.program,
           t.used_ublk, t.used_urec
           FROM v$session s, v$transaction t
           WHERE s.taddr = t.addr
           ORDER BY 5 desc, 6 desc, 1, 2, 3, 4;


      위 SQL 문을 여러번 수행해서 USED_UBLK 컬럼과 USED_UREC 컬럼의
      각 발생 사이의 delta 값을 비교해보면, 그 값이 클 수록 그
      session이 많은 양의 redo를 생성시켰음을 알 수 있다.

      위의 query에서 첫번 째 query는 많은 양의 redo를 generate한
      program을 check할 필요가 있을 때 사용하고, 두번 째 query는
      많은 양의 redo를 generate한 특정 transaction을 찾을 필요가
      있을 때 사용하면 도움이 된다.


Example
-------
none


Reference Document
------------------
<Note:167492.1

  • 유주환 2010.05.19 23:49

    실제 운영하고 계신 개발자 분들이나 담당자 분들에게 유용한 스크립트겠네요~


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Q&A Oracle관련 게시물만 Sean 2014.04.09 84902
140 TM 엔지니어필수품 file perfstat 2011.03.03 14115
139 TM RAC10g R2 patch(10.2.0.1->10.2.0.5) file 윤현 2011.03.02 10715
138 TM oracle client 와 database 간 상호 호환성(version) 1 담벼락 2011.01.24 23201
137 TM Automatic Storage Management file 담벼락 2010.12.31 10629
136 TM 10g Transportable Tablespace 에 대한 세미나 자료 입니다 file 송기성 2010.12.29 9204
135 TM Replication 세미나 자료 file 고구마 2010.12.29 11200
134 TM SystemState 세미나자료 file 고구마 2010.12.29 11009
133 TM Database Replay 담벼락 2010.12.27 9504
132 TM ORA-1578 조치를 위한 event 10231 1 이성철 2010.12.22 8449
131 TM (10g) 자동 통계정보 수집(AUTOMATIC OPTIMIZER STATISTICS COLLECTION) 담벼락 2010.12.16 16383
130 TM 오라클 디렉토리 변경 송기성 2010.12.16 24990
129 TM UPDATABLE SNAPSHOT 구축하기 고구마 2010.08.23 15507
128 TM replication table 다른 tablespace 로 옮기기 고구마 2010.08.23 13822
127 TM Flashback Query 승현짱 2010.05.30 8675
126 TM analyze connection failover options 유주환 2010.05.19 8864
125 TM 어플리케이션 페일오버와 로드밸런싱 유주환 2010.05.19 8843
124 TM fine-grained_auditing 1 유주환 2010.05.19 8594
123 TM library_cache_lock,_library_cache-orapybubu 유주환 2010.05.19 8871
122 TM fga와_vpd를_이용한_오라클_데이터베이스_보안_관련_문제와_답변 유주환 2010.05.19 10405
» TM 과도한 CPU 및 UNDO REDO 많이 사용하는 세션 찾기 1 고구마 2010.05.19 23731
Board Pagination Prev 1 2 3 4 5 6 7 8 Next
/ 8