일반적인 컴퓨팅 시스템은 물리적 메모리 크기의 한계를 극복하기 위해 Virtual Memory 기법을 사용 하며, 상이한 두 메모리를 매핑하기 위해 Page Table이 존재하고 Page단위로 관리됩니다. 리눅스 시스템의 경우 보통 4k 크기의 Page로 디자인되어 있습니다.
대용량 메모리를 장착한 시스템의 효율적인 Page Table관리를 위해 Linux Kernel 2.6 부터 HugePage 기술이 도입되어 좀 더 큰 Page 크기(예: 2M ~ 256M)로 관리할 수 있습니다.
Exadata의 Oracle DBMS는 이러한 Huge Page를 사용하여 SGA를 관리하는 것을 권장합니다. Exadata는 2048K 크기의 HugePage를 사용합니다.
Huge Page 사용의 잇점은 다음과 같습니다.
1. Normal Page와는 다르게 HugePage는 Swap되지 않습니다. 따라서 Page-in/.Page-Out의 Overhead가 없습니다.
2. HugePage는 상대적으로 적은 수의 Meta 정보로 좀 많은 물리적 메모리를 Cover하므로 CPU내의 Buffer(=Translation Lookaside Buffer, TLB)좀 더 많은 Page Entry를 보관할 수 있어 Page Hit율이 높아집니다.
3. Page Table에서 관리하는 물리적 메모리의 Entry 개수가 줄어들고 더 적은 메모리 공간을 차지합니다. 따라서 오라클 관점에서 보면 오라클 프로세스의 계산이나 PGA에 좀 더 많은 메모리가 제공됩니다.
4. Normal Page의경우, 50GB의 메모리를 관리하기 위해서는 1,300 만개의 page(13,107,200 = 50 * 1024* 1024 KB / 4 KB)가 유지되어야 합니다. HugePages를 사용할 경우 25,600 개의 Page가 관리되므로 메모리 관리을 위한 Overhead가 줄어들고 자원사용율도 절약됩니다.
Virtual Memory 시스템에서의 Page Table과 Physical Memory Mapping(Normal Page, Huge Page)
Normal Page와 Huge Page를 사용했을 때의 TPS (swing bench로 테스트(x축: 사용자, y축: TPS)
Oracle 11.2.0.2 이상부터는 use_large_pages = ( TRUE | FALSE | ONLY ) 파라미터를 사용하여 Oracle SGA 의 HugePage 사용을 관리하고 문제의 발생을 예방합니다.
Oracle 11.2.0.3 부터는 HugePages가 SGA에 비해 작을 경우, HugePages와 Normal Pages를 동시에 사용합니다.
HugePage Configuration을 확인하는 방법
1. memlock 확인(/etc/security/limits.conf). RAM 크기보다 약간 작은 크기정도로 설정됨을 확인 (단위 : KB, X2-2의 Computing Node의 Physical Memory는 96GB 임)
oracle soft memlock 88926480 ## memlock: 최대 고정 메모리(max locked memory)(
oracle hard memlock 88926480 ## 단위(KB)
2. Oracle Product Owner, 즉, oracle로 login하여 max locked memory 값 확인
ulimit -l
88926480
3. Hugepages 설정 확인
[root@ ~]# grep Huge /proc/meminfo
HugePages_Total: 13064 13054 * 2048 KB => 약 25 GB
HugePages_Free: 1111
HugePages_Rsvd: 1111
HugePages_Surp: 0
Hugepagesize: 2048 kB
※ 시스템상 Oracle의 SGA가 위치하는 shared memory segments를 확인
HugePages를 설정하는 방법
1. Oracle Instances를 뛰운다. 필수 AMM이 설정되어 있지 않아야 함 !!!!
2. MOS Note 401749.1의 스크립트를 이용하여 필요한 Hugepages 값을 찾는다.
## DB Instance를 모두 띄운후,
$ cd /u02/scripts
$ sh huge.sh
Recommended setting: vm.nr_hugepages = 9222
3. 해당 값을 설정한다.
# sysctl –w vm.nr_hugepages=9222
그리고 서버가 Reboot되더라도 설정값이 유지되기 위해서는 /etc/sysctl.conf에 vmm.nr_hugepages = 9222 를 설정합니다.
4. DBMS의 USE_LARGE_PAGES=ONLY 로 설정후 Restart
5. “$ grep Huge /proc/meminfo” 명령어로 Huge Page사용량을 확인
[ HugePage 관련 이슈 ]