본문 바로가기

Oracle/Oracle Admin

Database Oracle Administration_Oracle Instance의 할당 및 관리

Step 1. Oracle Server 전체 구조 살펴보기

- Sub : Oracle Instance의 할당 및 관리

 

오늘도 어김없이 Admin의 시작!ㅎ Oracle Instance에 대해 저번에 간단히 말을 했습니다. 뭐라구요? 메모리~ㅎ

Oracle을 시작하면 Instance를 생성하고~ 그 Instance에는 SGA(System Global Area)와 Background Process가 있다구요 ㅎ

Instance는 구조가 좀 복잡했었죠?

 

 

요로코롬 생긴게 Oracle Instance였어요 ㅎ 생각이 새록새록 나시려나 모르겠네요 ㅎ 이전에 보여드린 그림과 약간 다르게 생기기도 했죠

계속 구조를 보여드리는건 전에 말했듯이 전체적인 그림을 그리고 있어야 훨씬 수월하다는 것!ㅎ

이번 포스트에서는 세부적인 것을 보는 것이 아니라 Instance의 할당과 관리에 관해서만 보도록 하겠습니다.

Instance의 할당? 관리? 이게 뭔소리야.. 하실 수도있습니다. 하지만 이전에 Unix(Linux)의 구조를 보여드린 이유를 생각해보세요.

Oracle에게 메모리가 할당이 되어야 합니다. 하지만 요청한다고 무조건 줄 수 있는건아니잖아요?

 

예를 들어서 여러분의 통장 잔고에는 슬프게도 2만원밖에 없습니다. 하지만 친한 친구가 돈이 급하다고 3만원을 빌려달라네요.

여러분이 대출해서 빌려줄순 없는거고.. 2만원밖에 없으니 2만원을 줄까요? 그럼 여러분에게는 남는 돈이 없잖아요..ㅎ

하지만 이체 최대한도라는게 만원으로 되어있네요^^ 친구한테 만원만 빌려줘도 되는 상황이 발생하죠 ㅎ 어쩔수없는 상황이니까 ㅎㅎ

 

Oracle Instance와 OS의 관계도 마찬가지라고 생각해 볼께요. Hardware의 램이 2GB가 있습니다. 이걸 통장잔고라고 생각하고 ㅎ

Oracle이 Kernel에게 나 램 2GB만 줘 라고 요청을 하게 됩니다. 그럼 Kernel은 Oracle에게 줄 수 있는 한도를 Kernel Parameter를 통해 보게 됩니다. 바로 우리가 설치할때 쓴 Linux의 /etc/sysctl.conf, Unix의 /etc/system입니다. 왜 설치할때 귀찮게 이런거 했는지 알겠죠?ㅎ

한도를 보니까 1GB를 줄 수 있다고 합니다. Oracle에게 Kernel이 말하죠. 야 이거 한도가 1GB라 너한테 이거밖에 못줘 안그럼 나 적자야. Oracle은 두말 못하고 1GB만을 받아서 쓸 수 있는 상황!ㅎ 제가 생각해 낸 예인데 맞는 것같아서 뿌듯뿌듯 ㅎㅎ

 

다시한번 제대로 설명을 하겠습니다. Instance가 생성되는 과정을 말하면 Oracle을 실행 시킬때 Startup을 하죠? Strartup을 하면 최초의 Oracle Server Process가 초기화 파라미터(pfile or spfile)에 적혀있는 값을 가지고 OS Kernel에게 공유메모리를 달라고 요청합니다.

왜냐구요? 구조에서 Hardware와 직접적으로 붙어 있는 아이는? Kernel이기 때문이죠. 여기서 파라미터란 SGA를 만들기 위한 설계도라고 생각하시면 됩니다. 여기에 이것저것이 들어있습니다.

 

 

이 그림은 pfile의 모습입니다. memory와 undo, 컨트롤파일, 데이터베이스 이름, sga에 관한 모든 정보들이 들어있는 것을 알 수 있습니다. 이러한 것들을 kernel에게 요청을 하고 kernel은 system을 읽고 공유 메모리를 할당해 주고 세마포어로 다른 곳에서 사용하지 못하도록 막는 역을 또한 해줍니다. 세마포어(Semaphore)에 대해서 잘 기억하고 계신가요?ㅎ 화장실로 예를 들었었는데 ㅎ 그건 좀그랬죠..ㅎ

 

 

 

 

그래서 이번에는! On Air입니다 ㅎ 녹음중이거나 방송을 할때 쓰죠 ㅎ 여기게 불이 들어와 있으면 사용중 불이 꺼져있으면 사용중아님. 이런 표시죠 ㅎ 화장실보다 깔씀해서 보기좋네요 ㅎㅎ 아~ 상큼하네요

세마포어가 어느 역할을 하는지 아시겟죠?ㅎ 하나의 On Air 표시 뒤에는 방이 있겠죠? 그 방 하나하나를 메모리라고 상상해보세요 ㅎ 많죠? 그것들이 바로 RAM이고 그것들을 관리하는것이 Kernel입니다. 꾸준히~ 돌아다니는 관리자역할을 해주죠 ㅎ

그럼 예전에도 봤지만 한번더 Semaphore에 대해서 살펴보고 Kernel Parameter에 대해서도 한번 더 보도록 하겠습니다.

 

Semaphore는 원래 깃발이라는 뜻으로 현재 사용 여부를 나타내는 것으로 SEMMSL, SEMMNI, SEMMNS, SEMOPM 이 있습니다.

SGA는 공유 메모리라고 부르는데요. 공유라는 말에서 쫙쫙 느낌이 오죠?ㅎ 여러 프로그램이 공유해서 함께 쓰는 메모리 공간이라는 겁니다. On Air라고 표시되어 있는 저 방 뒤에 어느 세트가 세워지고 어느 방송을 하는지는 자유이고 어느 사람이든지 쓸 수 있다는 거죠. 단! On Air가 켜져있을 경우에는 다른 사람이 못쓰겠죠 ㅎ 그런게 깨지면 혼란이 오게 됩니다. 블루스크린이 뜨거나 Kernel Panic이 오죠. 그렇기 때문에 Semaphore의 역할과 Kernel Parameter의 역할이 매우매우 중요하고 Oracle과 OS Kernel은 뗄 수 없는 관계가 됩니다.

 

Kerenl에서 한번 Semaphore을 할당하는 것부터 한번 상세히 볼까요? 그럴려면 세마포어의 종류별로 어떤 역할인지도 봐야겠죠 ㅎ

세마포어(Semaphore)도 On Air의 켜짐/꺼짐, 화장실 사용중/사용가능 처럼 Set/Unset으로 구분이 되어집니다. 일반적으로 몇개의 세트로 묶여서 여러 개씩을 사용하게 되기도 합니다. 아래에서 사용하는 값들은 제가 전에 설치한 Redhat Oracle Linux 5 기반입니다.

SEMMSL : 앞에 SEM은 Semaphore를 뜻하는 거고 뒤에 MSL은 뭔지 감이 안잡히네요.. 전 풀네임을 중요시 여기는데..ㅎ SEMMSL은 위에서 말한 세트와 관련이 있는데요. 하나의 세마포어 세트당 세마포어의 최대 개수입니다. 보통 권장값은 Oracle 초기화 파라미터(pfile, spfile)의 processes의 더하기 10입니다. 위로 올라가서 볼까요? 11g의 기준은 150이네요 그럼 160 이상인데 저는 250으로..ㅎ

SEMMNI : 리눅스 전체에서 설정 가능한 세마포어 세트의 최대 개수를 의미합니다. 권장값은 100이상!

SEMMNS : 리눅스 전체에서 설정 가능한 세마포어의 최대개수입니다. 그럼 SEMMSL * SEMMNI를 하면 되겠죠?ㅎ SEMMSL을 한 클래스당 학생수로 보고 SEMMNI를 클래스의 개수라고 보면 되니까요 ㅎㅎ 사람별로 이해하기 나름이죠 ㅎ

SEMOPM : 1call(1개의 시스템 호출)이 초당 호출 가능한 최대 세마포어 개수입니다. 하나의 호출에서 여러개의 세마포어를 지원할 수 있습니다. 보통 SEMOPM은 SEMMSL에 의해서 정의되어지고 같도 같은 것을 권장한다고 합니다.

 

 

 

 

설정값은 요래요래 보실 수 있구요 ㅎ

max semaphores per array -> SEMMSL, max number of arrays -> SEMMNI, max semaphores system wide -> SEMMNS

max ops per semop call -> SEMOPM 이 되겠습니다. 잘알아 두셔야겠죠 ㅎ

이렇게 세마포어에 대해 알아 보았습니다. 그럼 이제 Kernel 파라미터에 대해서 볼까요?

SHMMAX, SHMMNI, SHMALL. SHMMIN, SHMSEG가 있습니다. 차례차례 알아봅시당 ㅎ

제생각엔 SHM이 Shared Memory 같아요 ㅎㅎ 이런 집착.. 좋은 집착인지 모르겠어요 ㅎ 용어를 외우려면 풀네임으로 외우는게 제일 좋다고 생객하서 풀네임에 계속 집착이 가네요 ㅎ

 

SHMMAX : 공유 메모리 세그먼트의 최대크기(바이트 단위)를 정의하는데 사용됩니다. 세그먼트라는 단위가 나왔죠? Kernel이 메모를 할당할때 엄청나게 큰 덩어리로 옛다~하면서 주는데 그것이 바로 세그먼트라는 큰 덩어리 입니다. 그러니까 SHMMAX는 큰 덩어리의 사이즈라는 거죠 ㅎ SHMMAX는 매우 중요한 파라미터인데요. 메모리의 낭비와 관련이 있기 때문입니다. Oracle RAM을 1GB를 쓸 수 있다고 합시당 ㅎ 그런데 SHMMAX를 200MB로 했다고 한다면..? 대여섯번개의 세그먼트로 나누어서 Oracle에게 주게 되는겁니다..ㅎ

회식을 할때 10명이서 갔는데 두명씩 다섯테이블로 앉았다면..? 엄청 까이겠죠?ㅎ 회식이 아닌 데이트도 아니고..ㅎ 그렇다고 해서 저번 실수를 만회하기 위해서 20명 단체석을 빌렸는데 회식에 14명밖에 안왔습니다.. 그럼 6명의 자리가 남게 되고 비효율이 발생하게 되는것! 그래서 SHMMAX가 중요하다고 생각해야 합니다. 기본값은 32M로 주는 Kernel..ㅎ 쪼잔하죠? 보통 서버의 램이 충분하고 할당 할 수 있다면 SHMMAX를 2GB로 설정 해줍니다. 다시 말하면 한개의 세그먼트를 보내는데 2GB짜리 메모리를 떡~하니 크게 주는거죠 ㅎ

 

 

 

저도 설치할때 2GB를 주었지만.. 이렇게 보면 512MB로 줄어 든 것을 알 수 있습니다. 무조건 크게 준다고 해서 OS Kernel이 크게 주는 거 아니라는 것! 잘 알아두셔야합니다 ㅎ 얘 보기보다 똑똑한 아이니까요 ㅎ

값을 수정하는 것은 총 세가지의 방법이 있습니다.

1. root권한으로 /etc/system이나 /etc/sysctl.conf에서 설정하고 sysctl -p를 통해 재부팅 없이 적용

2. echo "적용값(ex) 2147483648 2GB)" > /proc/sys/kernel/shmmax

3. sysctl -w kernel.shmmax=2147483648 후 sysctl -p를 통해 재부팅 없이 적용

 

SHMMNI : 공유 메모리 세그먼트의 최대 개수를 설정하는데 사용됩니다. 기본값 자체가 4096으로 만족하는 값!ㅎ 위에서 SHMMAX를 2G라고 했는데.. 4096개면.. 몇개인건지 하핳.. 제 경우 512MB인데 4096은?? 헿 상상안해도 되겠죠 ㅎ /proc/sys/kernel/shmmni를 확인 하시면 알 수 있슴다 ㅎ

 

SHMALL : 특정 시점에 시스템에서 사용 가능한 공유 메모리의 최대 크기(페이지 단위)를 설정하는데 사용됩니다. 공유 메모리의 최대크기!? SHMMAX 아냐? 라고 생각하실 수도있는데요. SHMMAX는 공유메모리 세그먼트의 최대크기입니당ㅎ 개념 확실히!ㅎ 그럼 이건 뭐냐~ 작업 단위를 페이지로 해서 작업 효율을 높이는 것이라고 하네요.

ceil(SHMMAX/PAGE_SIZE) 최소한 이 값을 맞추라고 하는데요. 디폴트 사이즈는 2097152bytes입니다. 2M입니다. 그대로 할께요 ㅎ

OS별로 페이지 사이즈가 다르기 때문에 잘 알아보고 결정 해야합니다.

 

 


왼쪽은 root 계정으로 들어가서 알아본 Linux의 페이지 사이즈 4096이 나오고 오른쪽은 SHMALL인데요. 2MB로 되어있죠!ㅎ

 

SHMMIN : 단일 공유메모리 세그먼트의 최소크기(Byte)를 의미합니다.

SHMSEG : 1개의 Process에 부여될 수 있는 공유메모리 세그먼트의 최대 개수입니다. SHMMNI랑 뭔차이지? 하실 수도있는데요. SHMMNI의 경우에는 시스템 전체에서의 공유메모리 세그먼트의 개수이고 SHMSEG는 1개의 프로세스에 부여될 수 있는 세그먼트의 개수입니다.

 

Kernel은 위와 같은 값들을 보고 SGA로 사용할 공유 메모리를 Oracle에 할당해 줍니다. 이때 세가지의 방법으로 줍니다.

첫째, 아까말했듯이 하나의 적당히 큰 세그먼트를 줘서 전체 SGA가 할당이 될 수 있습니다.

둘째, RAM이 부족하여 하나의 세그먼트에 줄 수 없다면 여러개의 연속된 세그먼트로 분산시켜서 할당이 될 수 있습니다.

셋째, 첫째와 둘째 방법이 되지 않을 경우 최악의 경우에는 불연속적인 세그먼트로 떨어져서 할당 해야합니다.. 효율이 많이 떨어지겠죠.

단, SGA에서 Fixed Area 부분이 있는 것이 보이세요?ㅎ 위로 가서 보시면 있습니다. 이것은 하나의 세그먼트에 할당되어야 합니다.

 

다시한번 예를 들어보면 회식을 하는데 10명이 다같이 하는 테이블이 첫번째 방법! 화기애애하고 보기 좋죠 ㅎㅎ

10명이서 갔는데 테이블이 연속해서 떨어져 있다. 그러면 어쩔수 없이 연속해서 다닥다닥 테이블별로 앉아서 떨어져 있어도 얼굴보며 회식을 하겠죠. 하지만! 세번째.. 불연속적으로 멀리떨어져있고 막 그러면 그건 회식이 아니죠.. 그냥 식사지..ㅎ 이런 비효율이 있는겁니다.

 

이렇게 Oracle Instance 할당과 관리에 대해서 알아 보았습니다. 좀 길고 어려웠을 겁니다. 저도 서진수 쌤 책이랑 다른 책들보면서 이해를 했으니까요..ㅎ 어려운거 당연하지만 이런것을 잘 알아야 나중에 튜닝이나 고급 기술을 할 수 있다는거! 잘 정리 해야합니다! 뿅 ㅎ