본문 바로가기

카테고리 없음

ORACLE SUBPOOLS v1.0

ORACLE SUBPOOLS

 

from metalink ID 455179.1

from http://askdba.org/weblog/2008/03/shared-sub-pools

 

1.    ORACLE SUBPOOLS

SUBPOOLS 의 수는 다음의 요소로 결정된다.

-CPU (CPU_COUNT)

-SHARED_POOL_SIZE

 

SUBPOOLS 9.2.0.5 부터 가능하다.

 

SUBPOOLS ORA-4031 의 해결안으로도 언급된다. (여기서는 언급하지 않음)

 

SUBPOOLS 할당으로 SHARED MEMORY 구조를 보호하기 위한 LATCH 경합을 줄일 수 있다고 한다. 일례로 shared pool sub pools 로 구성하게 되면 shared pool 에 하나씩 할당되는 latch : shared pool sub pools 수만큼 가질 수 있게 된다.

 

2.    SUB POOLS

A.     CPU

CPU 수에 따른 SUBPOOLS 의 수는 METALINK 자료에 의하면 다음의 공식으로

구한다고 한다.

 

@max_lists_by_cpu = ((cpu_count -1) >> 2) + 1

 

i.e,

1-4 CPU’s = 1 subpool

5-8 CPU’s = 2 subpools

9-12 CPU’s = 3 subpools

 

max_lists_by_cpu ‘>>’ 가 도대체 무얼 의미하는지 의문이지만 간단하게 이야기

해서 cpu_count 4 subpool 하나가 할당된다고 보면 될 듯 하다.

 

B.     MEMORY

-MANUAL SHARED MEMORY MANAGEMENT(shared_pool_size)

subpool 에 대한 최소할당량은 9i 128m ,10g 256m ,11g 512m 이다.

 

세부버전에 대한 할당량은 다음과 같다. (askdba.org 참조)

 

9.2.0.5 – 9.2.0.8 : 128Mb per subpool

10.1.0.1-10.2.0.3 : 256Mb per subpool

10.2.0.4 > : 512 Mb

11.1.0.6 > : 512 Mb

 

결과적으로 CPU, MEMORY 에 대해 위와 같은 방법을 이용해 min(a b) 를 사용한다.

다시말해 메모리가 아무리 커도 cpu_count 1-4 값이라면 subpool 은 하나가 된다.

 

C.     _kghdsidx_count

min(a b) 로 정해지는 값이 아니라 사용자가 subpools 수를 고정할 수 있다.

 

3.    주의사항

SHARED_POOL_SIZE, CPU_COUNT DYNAMIC 변경이 안된다. 다시 말해 DB RESTART 가 필요하다.

 

_kghdsidx_count 를 직접 변경하더라도 CPU, MEMORY 에 대한 제약을 벗어나지 못한다.

실제 환경을 구성하면 좋겠지만 CPU 의 제약은 크다;;

 

아래는 11g R2 에서 shared_pool_size = 1600m _kghdsidx_count = 2 로 변경한 내용이다. cpu_count 값은 변경을 하더라도 실제 시스템 환경에 의해 원복된다. 실제 하드웨어 스펙에서 내려가는 건 가능해도 오버하는 건 안되는 것 같다.

(ex: 쿼드코어 환경에서 cpu_count 2로 내리는건 되도 8로 올리는건 불가능)

/*+ test case 추가 cpu_count down */

 

SQL> @parameter

Enter value for name: kghdsidx

old   7: AND KSPPINM like lower('%&NAME%')

new   7: AND KSPPINM like lower('%kghdsidx%')

 

NAME                 SESMO SYSMOD    DESCRIPTION

-------------------- ----- --------- ----------------------------------------

_kghdsidx_count      FALSE FALSE     max kghdsidx count

 

parameter 를 조회한 화면이다. scope=memory|both 가 안됨을 알 수 있다. 다시 말해 db restart 가 필요하다.

 

SQL> alter system set "_kghdsidx_count"=2 scope=spfile;

 

System altered.

 

SQL> startup force;

ORACLE instance started.

 

Total System Global Area  351543296 bytes

Fixed Size                  1336428 bytes

Variable Size             293604244 bytes

Database Buffers           50331648 bytes

Redo Buffers                6270976 bytes

Database mounted.

Database opened.

SQL> show parameter _kghdsidx

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

_kghdsidx_count                      integer     2

 

hidden parameter 를 한번 수정하면 show parameter 로 볼 수 있다. 아까 변경한 대로 2 가 되었다. 참고로 cpu_count 값을 변경한 경우 restart 시점에 값이 원복된다.

 

ora112@/home/oracle>ipcs -m

 

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status     

0x00000000 65536      oracle    600        393216     2          dest        

0x00000000 98305      oracle    600        393216     2          dest        

0x00000000 131074     oracle    600        393216     2          dest        

0x00000000 163843     oracle    600        393216     2          dest        

0x00000000 196612     oracle    600        393216     2          dest        

0x00000000 229381     oracle    600        393216     2          dest        

0x00000000 262150     oracle    600        393216     2          dest        

0x00000000 294919     oracle    600        393216     2          dest        

0x00000000 327688     oracle    600        393216     2          dest        

0x18ee5fe4 589833     oracle    660        356515840  26

 

shared memory 에 대해 조회한 화면이다. key 0x00000…. db startup 이전에도 있었던 값으로 무시하면 된다. subpool 이 실질적으로 구성이 되면 shared memory 에 대해 key 를 가지는 값이 하나 더 있어야 한다. 위의 화면을 보면 하나밖에 존재하지 않음을 알 수 있다.