새싹 DBA/Oracle

[오라클] 메모리 증설 SGA PGA 서버 작업까지

LIMMI 2025. 3. 21. 15:04


리눅스 서버에서 메모리 증설 후 Oracle SGA/PGA 조정 절차 (완벽 정리)

✅ 1. 리눅스 서버에서 할 작업

💡 물리적 메모리 증설이 완료된 상태에서 진행
 
1️⃣ 현재 시스템 메모리 확인

free -g   # GB 단위로 확인

증설전 → 증설후

MemTotal:       16384 MB  # 기존 16GB
MemTotal:       32768 MB  # 증설 후 32GB

 
2️⃣ 리눅스 커널 매개변수 조정 (shmmax, shmall 설정)
Oracle은 **공유 메모리(shared memory)**를 사용하므로, shmmax, shmall 값을 조정해야한다. (잘못하면 DB 안올라옴 )

vi /etc/sysctl.conf

📌 설정 변경 (메모리 32GB 기준 예제)

kernel.shmmax = 30769803776  # > sga_max_target 27G * 1024*1024*1024
kernel.shmall = 6291456      # shmmax / PAGE_SIZE (4096)

 
shmmax 계산 공식: shmmax ≥ SGA (SGA_TARGET 또는 SGA_MAX_SIZE)
shmall 계산 공식: shmmax / 페이지 크기 (보통 4096바이트)
 
적용하기 (중 요 !)

sysctl -p

 
🔹 참고 SHMMAX (kernel.shmmax)의 의미

  • SHMMAX는 **"단일 공유 메모리 세그먼트의 최대 크기"**를 의미함.
  • 즉, SHMMAX는 SGA 크기(SGA_TARGET 또는 SGA_MAX_SIZE)보다 크거나 같아야 한다.
  • 하지만 SHMMAX가 SGA + PGA 전체를 포함할 필요는 없음. (PGA는 공유 메모리가 아닌 개별 프로세스 메모리이므로 SHMMAX와 무관함.)

3️⃣ HugePages 설정 (SGA 성능 향상)
 
1) 현재 HugePages 설정 확인

grep Huge /proc/meminfo

📌 예시 (기본값은 설정 안되어있음)

HugePages_Total:       15500
HugePages_Free:        1690
HugePages_Rsvd:        16
HugePages_Surp:        0
HugePagesize:          2048 kB
Hugetlb:               31744000 kb

 
2) HugePages 개수 계산
💡 SGA가 24GB 필요하면

  • HugePage 크기 확인
grep Hugepagesize /proc/meminfo

#결과
Hugepagesize:       2048 kB

 
필요한 HugePages 수 계산

  • SGA_TARGET / HugePageSize
  • 예제: 24GB / 2MB = 24*1024* / 2 =  12288 페이지 (단위 맞춰서 계산해주기)

3) HugePages 적용

vi /etc/sysctl.conf

 
 
수정 :

vm.nr_hugepages = 12288

 
적용 (중요) :

sysctl -p

✅ 2. Oracle에서 할 작업

1️⃣ 현재 SGA/PGA 설정 확인

SHOW PARAMETER SGA;
SHOW PARAMETER PGA;
NAME                         TYPE        VALUE
---------------------------- ----------- ----------
sga_target                   big integer 12G
sga_max_size                 big integer 12G
pga_aggregate_target         big integer 4G

 
2️⃣ 새로운 SGA/PGA 크기 계산
✔ SGA = 오라클에 할당된 메모리의 60~70% (전체메모리 *0.5 * 0.7)
✔ PGA = 오라클에 할당된  메모리의 20~30% (전체메모리 *0.5 * 0.3)
✔ OS  에 전체 메모리의 50% 남기기
 
📌 예제 (메모리 32GB → 64GB 증가 시)
 

  • 기존: SGA_TARGET=12G, PGA_AGGREGATE_TARGET=4G
  • 변경 후: SGA_TARGET= 64 * 0.5 * 0.7 = 22.4G, SGA_MAX_SIZE = 64 * 0.5 * 0.7 = 22.4G , PGA_AGGREGATE_TARGET=  64 * 0.5 * 0.7  = 9.6G

3️⃣ SGA/PGA 변경 적용 (SPFILE 기준)

ALTER SYSTEM SET SGA_MAX_SIZE = 22G SCOPE=SPFILE SID='*';
ALTER SYSTEM SET SGA_TARGET = 22G SCOPE=BOTH SID='*';
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 10G SCOPE=BOTH SID='*';
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 20G SCOPE=BOTH SID='*';

 
📌 SPFILE 사용 시 재시작 필요, SGA_MAX_SIZE 는 SPFILE 에만 적용가능

shutdown immediate;
startup;

또는

#싱글노드
srvctl stop database -db DIGWDB
srvctl start database -db DIGWDB

#RAC
srvctl stop instance -d sigwdb -i SIGWDB1
srvctl start instance -d sigwdb -i SIGWDB1

srvctl stop instance -d sigwdb -i SIGWDB2
srvctl start instance -d sigwdb -i SIGWDB2

 

✅ 3. 추가적인 성능 점검

1️⃣ Buffer Cache Hit Ratio 확인 (SGA 튜닝 체크)

SELECT name, value FROM V$SYSSTAT WHERE name IN ('buffer cache hit ratio');