물리 메모리 증설 시 인스턴스 메모리 설정을 변경하기 전에 kernel.shmmax, kernel.shmall, vm.nr_hugepages 파라미터를 변경해야 합니다.
참고로 아래 명령어로 파라미터 값을 조회할 수 있습니다.
# sysctl -a | grep kernel.shm
# cat /etc/sysctl.conf | grep kernel.shm
kernel.shmmax 파라미터는 공유 메모리의 최대 크기(바이트)를 의미하며 일반적으로 물리 메모리 크기와 동일한 값을 설정합니다. kernel.shmall 파라미터는 공유 메모리의 최대 페이지 개수를 의미하며 CEIL (shmmax / PAGE_SIZE) 공식으로 값을 계산할 수 있습니다. 증설의 경우 두 파라미터 모두 기존 값에 증설한 비율을 곱한 값을 설정하면 됩니다. 참고로 파라미터 값은 sysctl 명령어의 -w 옵션과 -p 옵션으로 설정할 수 있습니다. -w 옵션은 입력 값을 설정하며, -p 옵션은 /etc/sysctl.conf 파일에 저장된 값을 설정합니다. 리부트 후에도 설정값을 적용하려면 /etc/sysctl.conf 파일의 값을 변경해야 합니다.
# sysctl -w kernel.shmmax=value
# vi /etc/sysctl.conf
kernel.shmmax = value
kernel.shmall = value
# sysctl -p
참고로 아래의 명령어로 PAGE_SIZE 값을 조회할 수 있습니다.
# getconf PAGE_SIZE
4096
vm.nr_hugepages 파라미터는 HugePage 개수를 의미하며 (SGA / Hugepagesize) * 1.05 공식으로 대략적인 값을 계산할 수 있습니다. 정확한 값은 hugepages_settings.sh 스크립트로 계산해야 합니다. 증설의 경우 기존 값에 변경된 비율을 곱한 값을 설정하고 인스턴스를 재기동 후에 hugepages_settings.sh 스크립트로 계산된 값을 재설정하면 됩니다.
# vi /etc/sysctl.conf
vm.nr_hugepages=value
# sysctl -p
아래 링크에서 hugepages_settings.sh 파일을 다운로드할 수 있습니다.
참고로 아래의 명령어로 Hugepagesize 값을 조회할 수 있습니다.
# cat /proc/meminfo | grep -i huge
HugePages_Total: 71680
HugePages_Free: 4710
HugePages_Rsvd: 1
HugePages_Surp: 0
Hugepagesize: 2048 kB
memlock은 잠글 수 있는 메모리(SGA)의 최대 크기(바이트)를 의미하며 vm.nr_hugepages * Hugepagesize 공식으로 값을 계산할 수 있습니다. vm.nr_hugepages 파라미터에 따라 memlock 값을 변경해야 하지만 Exadata는 memlock 값이 unlimited로 설정되어 있어 값을 변경할 필요가 없습니다.
# cat /etc/security/limits.conf | grep memlock
oracle soft memlock unlimited
oracle hard memlock unlimited
kernel.shmmax, kernel.shmall 파라미터를 잘못 설정하면 ORA-27102: out of memory 또는 ORA-27104: system-efined limits for shared memory was misconfigured 에러가 발생할 수 있고, vm.nr_hugepages 파라미터를 잘못 설정하면 ORA-27106: system pages not available to allocate memory 에러가 발생할 수 있습니다. 만약 사용중인 HugePage가 해제되지 않아 ORA-27106 에러가 발생한 경우라면 icps -m 명령어로 사용 현황을 확인하고 sysctl 명령어로 vm.nr_hugepages 파라미터를 0으로 설정하여 HugePage를 해제한 후 값을 재설정해야 합니다.
# ipcs -m
# sysctl -w vm.nr_hugepages=0
# sysctl -p
관련 링크