Tip
2010.04.28 16:16

shared pool / library cache

조회 수 25066 추천 수 0 댓글 0

Shared Pool / Library Cache와 OWI
===================================
shared pool 도 여러종류 메모리 영억으로 나누어진다

SQL> select count(*) from v$sgastat where pool = 'shared pool';

  COUNT(*)
----------
       595

SQL> select *
from (select name, bytes from v$sgastat where pool = 'shared pool'       
order by bytes desc                                                       
)                                                                         
where rownum <= 20;                                                       
                                                                               
NAME                            BYTES                                          
-------------------------- ----------                                          
free memory                   7511436                                          
library cache                 4249580                                          
KCB Table Scan Buffer         3981204
KSFD SGA I/O b                3977128
row cache                     3741868
sql area                      3340328
KQR M PO                      2213428
ASH buffers                   2097152
kglsim hash table bkts        2097152
event statistics per sess     1361360
KTI-UNDO                      1235304

NAME                            BYTES
-------------------------- ----------
private strands               1198080
PL/SQL MPCODE                 1066256
KSXR receive buffers          1034000
kglsim object batch            968112
kks stbkt                      917504
CCursor                        913708
FileOpenBlock                  853232
KSXR pending messages que      842636

...

- Shared pool 은 또 크게 다음과 같이 구분한다.

-Permanent Area : 프로세스 목록, 세션 목록, Enqueue 목록, Transaction 목록등의 자원들은
                  Shared Pool 의 영구 영역에 할당되며 인스턴수와 그 수명을 같이 합니다.
                 
-Library Cache : SQL문을 수행하는데 필요한 모든 객체(SQL, 테이블, 뷰, 프로시져 등)에 대한 정보를 관리한다.

-Row Cache : 디셔널리 캐시라고 부름 ...

-Reserved Area : 예약영역, 동적인 메모리 할당을 위해 오라클의 여분의 예약 영역을 할당해둔다.

Heap에 대하여
-----------------
- Shared Pool 은 Heap 이라고 불리는 메모리 관리 기법을 이용해 관리합니다.
  - Heap Manager(KGH, Kernel Generic Heap) 에 의해 관리되며 오라클의 가장 기본적인
    메모리 할당 방법이다.
    Memory Manager(KSM, Kernel Service Memory)가 제공하는 서비스를 이용해 동적으로 메모리 관리한다.
    KGL(Kernel Generic Library Cache)는 Heap Manager를 이용하여 Library Cache를 관리한다.
   
   
-  하나의 extent는 여러개의 chunk(heap의 포인트정보)로 구성되어 있으며 그래뉼 단위로 할당 된다. sag < 1g 4m
              sga >= 1g 16m (10g)
             
- Heap Dump를 이용하면 힙의 구조를 물리적으로 관찰할 수 있다.

sql> alter session set events 'immediate trace name heapdump level 2';
 
udump에 trace가 떨어지고 node 94page를 참고하면 된다 여러개의 extent가 보인다.그아래 서브 heap 구조가 보인다.                                         

#### shared pool 래치는 전체인스턴스에 하나만 존재하며, 필요한 메모리(청크)를 할당받는 전체
     과정동안 보유해야 한다. 따라서동시에 많은 프로세스가 래치를 획득하는 과정에 경합 발생
     latch: shared pool 이벤트를 대기
     - 오라클 9i 부터는 shared pool 을 여러개의 서브풀로 최대 7개까지 나누어 관리가능하다.
       _KGHDSIDX_COUNT 히든 파라미터를 이용하면 서버풀의 개수를 관리할 수 있다.
       CPU개수가 4이상이고, Share Pool 크기가 250m 이상인 경우
       _KGHDSIDX_COUNT 의 값만큼 서브풀을 생성해서 SHARED POOL을 관리한다.
       서버풀은 독립적으로 Shared pool 을 관리하며 독자적인 freelist, LRU 리스트,Shared pool 래치를
       가진다 "!!! 따라서 Shared pool 크기가 큰 경우에는 서브풀로 나누어 관리함으로써
       shared pool 래치 경합을 줄일 수 있다.
      
       select ksppinm, ksppstvl
       from x$ksppi x, x$ksppcv y
       where (x.indx = y.indx)
        and (translate(ksppinm,'_','#') like '%&1%');
       
        _KGHDSIDX_COUNT 최대 7개까지 CPU가 4개 이상이고 Shared pool size가 250M이상일때...

# Library Cache 구조

KGL(Kernel Generic Library Cache)에 의해 관리되는데, KGL은 KGH를 이용해서 청크를 할당받는다.

shared pool이 크면 안좋은 이유 : latch : shared pool 이 걸릴때
- 프리리스트에 딸린 프리 청들의 검색하는데 wait가 걸리기 때문 이때는 줄여야 함...
  아니면 250m 이상 4cpu이면 _kghdsidx_count 설정
 
- 버젼 카운트(Version Count) 가 높을 때
  => 부모 LOC를 두고 그밑에 자식 LOC들의 COUNT가 비정상적으로 높게 나올때 (버그)
     V$SQL_AREA 뷰의 VERSION_COUNT 컬럼값을 확인
    
- SGA에서 페이지 아웃이 생길 때
  => shared Pool이 디스크로 페이징 아웃된 경우 latch:library cache 대기가 높은 시점에
     OS 스왑현상이 발생한다면 페이징 아웃에 의한 성능저하 확률이 높다.
    
     Page Out 방지법
     -HP_UX, AIX : LOCK_SGA 파라미터 값을 TRUE로 변경한다. (기본값이 FALSE이다.)
     -SunOS      : _USE_ISM 파라미터 값을 TRUE인지 확인한다. (기본값이 TRUE이다.)
    
- latch : library cache 이벤트를 해결하는 법
 
   1. 파싱회수 자체를 줄인다.
      - JAVA 환경이라면 PreparedStatement 객체를 이용해서 파싱을 1회만 수행하고 close를 수행하지 않는다...
        이방법이 항상 가능한 것은 아님...
     
      - Web Application Server의 경우 Statement Caching 기능을 제고 이것도 비슷한 효과를 본다..
         
      - PL/SQL의 Dynamic SQL 을 사용하면 cursor 재사용의 해택을 받으나 이로인해 문제가 된다.
        가능하면 STATIC SQL 을 사용하라...
       
    2. 세션 레벨에서만 가능한 SESSION_CACHED_CURSORS 파라미터를 이용하라...
       Dynamic SQL 에 execute immedidate 'alter session ...... 하면 된다.
       p232 참고....

################ SESSION_CACHED_CURSORS 의 예 ....
-많은 수의 소프트 파싱 수행

SQL>CREATE or replace procedure do_soft_parse(p_idx in number)
    is
      v_value number;
      v_cursor sys_refcursor;
    begin 
          - Session cursor cache 기능을 활성화함
          execute immediate 'alert session set session_cached_cursors = 50';
         
          for idx in 1 .. 10000 loop
               open v_cursor for 'select 1 from test test' ||p_idx||
                 ' where rownum =1'
               -fetch v_cursor into v_value;
               close v_cursor;
         end loop;
        
     end;
     /
    
- shared pool flush
sql>alter system flush shared_pool;

- 많은 수의 소프트파싱을 수행
sql> var job_no number;

sql>begin
    for idx in 1 .. 49 loop
          dbms_job.submit(:job_no,'do_soft_parse('||idx||');');
          commit;
    end loop;
    end;
    /
   
 -현제 세션에서도 소프트파싱를 수행하고, V$SESSION_EVENT 뷰를 통해서 대기현상을 관찰한다.
 SQL>exec do_soft_parse(50);
 SQL> @my_sess_event        


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Q&A Oracle관련 게시물만 Sean 2014.04.09 84902
159 Tip TEMP TABLESPACE 사용현황 조회하기 1 고구마 2010.05.19 43816
158 TM windows에서 Opatch 진행시 oci.dll 에러 조치 1 이현정 2012.03.26 37459
157 Tip 핫백업 디비올리기 유주환 2010.04.09 34980
156 Tip UDP Buffer Tuning 기법 3 김준호 2010.05.04 30913
155 Tip Log miner 사용방법 1 김준호 2010.04.06 29921
154 Tip 오라클 null값 정리 유주환 2010.04.18 29867
153 Tip (Diagnostics) Oracle10g DB 접속 안될때 sqlplus 에서 SYSTEMSTATE DUMP 받기 1 고구마 2011.05.18 29071
152 Tip shared pool wait event 2 file 유주환 2010.04.05 28881
151 Tip em 실행시 에러 발생 조치 1 dbkill 2010.12.15 27305
150 Tip 오라클11g에서 SE1,SE,EE제품의 옵션비교입니다. file perfstat 2012.03.07 27011
149 TM audit 관련 2 이현정 2012.03.29 26572
148 TM check whether crs auto start is enable or disable 담벼락 2012.10.12 26288
147 Tip EM 재구성 고구마 2010.04.09 26261
146 Tip 10g standard edition과 enterprise edition의 차이점 2 윤현 2011.05.16 26051
145 Tip Buffer Cahe 관련 대기 이벤트들 고구마 2010.04.28 25635
144 TM 테이블과 인덱스의 관계 및 인덱스 종류 및 생성 방법. Tech1 2012.03.28 25524
143 Tip EXPORT/IMPORT 이용한 TABLE과 INDEX 분리하는 방법 고구마 2010.05.24 25453
142 Tip sysaux resize 유주환 2010.04.18 25290
» Tip shared pool / library cache 고구마 2010.04.28 25066
Board Pagination Prev 1 2 3 4 5 6 7 8 Next
/ 8