개발은 너무해

shmmax 값에 대한 추측성 글 본문

Oracle/Oracle Study

shmmax 값에 대한 추측성 글

까칠 평생초보 2015.03.10 18:12

현재 서버

shmmax=1g

shmseg=120

SGA = 48G


신규서버

shmmax=1g

shmseg=120

SGA = 110G 위로 올라가지 않음.


왜 그런 것인지를 찾아봄.


shmmax 할당 : SGA 보다 크거나 같게 설정하는 것을 권장한다고 함.


현재 알아본 바로는,

1. sga 값보다 shmmax를 낮게 설정하면, 여러개의 shared memory가 뜨는 것을 볼 수 있다.

 - ipcs -ma 명령어로 SEGSZ 값을 합산하면 대략적으로 sga값과 동일하게 나온다.

2. sga 값보다 shmmax를 높게 설정하면, 한개의 shared memory가 뜨는 것을 볼 수 있다.


의문. sga 값보다 shmmax를 낮게 설정하였는데, 에러가 발생하였다.

       - ORA-27123: unable to attach to shared memory segment

      위 1번에 의하면 여러개의 shared memory가 떠야하는 것이 아닌가?


답변추측. shmseg 값이 현재 120으로 설정되어있다. shared memory가 120개가 초과하여 발생하는 문제 같다.

          sga 가 48g로 설정되어 있고 shmmax 가 1기가로 설정되어 있었을 때, 53개의 메모리가 떴다.

          그러면 192g로 설정을 하려고 하니 120개를 초과하여 발생하는 문제 인 것 같다.


이를 검증하기 위해서는, 아래와 같이 한번 해보자

1. shmmax 에 값을 sga 값만큼 올려주고, shared memory 개수를 확인.

2. shmmax 값은 그대로 두고 shmseg 값만 올려주고 shared memory 개수를 확인.


설명에 의하면 아래와 같으니 내 추측이 맞을 것이라 봄.


커널이 공유메모리(오라클이 SGA로 사용할) 할 당 방법

 1. 공유메모리로 사용할 물리적 메모리가 충분할 경우.

  -> 하나의 세그먼트에 전체 SGA 할당

 2. 하나의 세그먼트에 다 할당할 수 없는 경우

  -> 연속된 여러 세그먼트로 분산시켜 할당

 3. 두번째 방법도 여의치 않을 경우

  -> 연속되지 않은 여러 세그먼트에 분산시켜 할당

* SGA내 fixed Area 부분은 반드시 전체가 하나의 세그먼트에 할당되어야 함.


=====================================================================================================================

테스트 결과는 맞게 나옴.

다만, 커널값을 shmmax, shmseg 등 설정값을 늘려주었다고 하더라도,

pfile에 또 하나의 값을 변경해줘야지 DB가 startup 될 수 있다.

만약 그렇지 않으면, ORA-00064 에러가 난다.(ORA-00064: object is too large to allocate on this OS(1,4086000))

pfile에 추가할 파라미터, _ksmg_granule_size=33554432(32M)

- default = 16777216(16M)


* granule size 확인

select name, bytes/1024/1024 "size" from v$sgainfo where upper(name) like '%GRANULE%'


NAME                                                                   size

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

Granule Size                                                            32



Granule(메모리 할당 단위)

 - SGA 메모리는 연속적인 메모리 조각(Chunk) 을 뜻하는 Granule 이란 단위로 할당된다.

 - Granule의 크기는 SGA 총 크기에 의해 결정된다. SGA의 크기가 1GB 이하라면 Granule의 크기는 4MB, 1GB 이상이라면 Granule 크기는 16MB 가 된다.

 - SGA의 각 컴포넌트들에 쓰여지는 Granule size는 v$sgainfo 로 조회가 가능하다.



'Oracle > Oracle Study' 카테고리의 다른 글

shmmax 값에 대한 추측성 글  (0) 2015.03.10
External Table  (0) 2014.07.16
archive 와 log switch v$log  (0) 2013.01.18
rowid의 변화  (0) 2013.01.17
기본적인 궁금증들(?)  (0) 2012.09.23
Windows Oracle 10g 설치  (0) 2012.09.23
0 Comments
댓글쓰기 폼