<<Oracle Linux Huge Page>>
출처 :
http://otsteam.tistory.com/183
https://oracle-base.com/articles/linux/configuring-huge-pages-for-oracle-on-linux-64
https://docs.oracle.com/cloud/latest/db112/REFRN/initparams268.htm#REFRN10320
용어
-. Hugepage = LargePages
-. very large memory (VLM) (>= 4GB) ( 문서 ID 361323.1 )
-. 8기가 이상 메모리 사용 시, SWAP 에 의한 DB 성능 저하를 위해서 검토.
대용량 메모리를 장착한 시스템의 효율적인 Page Table 관리를 위해 Linux Kernal 2.6 부터 Hugepage 기술이 도입되어 좀 더 큰 Page 크기(예 : 2M ~ 256 M)로 관리할 수 있습니다.
Exadata 의 Oracle DBMS 는 이러한 Huge Page를 사용하여 SGA를 관리하는 것을 권장합니다.
Exadata는 2048K 크기의 Hugapege 를 사용하여 SGA 를 관리하는 것을 권장합니다.
Exadata는 2048K 크기의 Hugapage 를 사용합니다.
HugePage 사용의 장점은은 다음과 같습니다.
1. Normal Page 와 다르게 Hugepage 는 SWAP 되지 않습니다.
2. HugePage는 상대적으로 적은 수의 Meta 정보로 좀 많은 물리적 메모리를 Cover 하므로
CPU 내의 Buffer(=Transaction Lookable Buffer, TLB)로 좀 더 많은 Page Entry 를 보관할 수 있어 Page Hit 율이 높아집니다.
3. Page Table 에서 관리하는 물리적 메모리의 Entry 개수가 줄어들고 더 적은 메모리 공간을 차지합니다
따라서 오라클 관점에서 보면 오라클 프로세스의 계산이나 PGA 에 좀 더 많은 메모리가 제공됩니다.
4. Normal Page 의 경우, 50G의 메모리를 관리하기 위해서는 1,300 만개의 page (50*1024*1024 / 4 KB = 13,107,200 ) 가 유지 되어야 합니다.
Hugepage 를 사용할 경우 25,600 개의 Page 가 관리되므로 메모리 관리를 위한 Overhead가 줄어들고 자원사용율도 절약 됩니다.
Oracle 11.2.0.2 이상부터는 use_large_pages = TRUE | FALSE | ONLY 파라미터를 사용하여 Oracle SGA 의 Hugepage 사용을 관리하고 문제의 발생을 예방합니다.
Oracle 11.2.0.3 부터는 Hugepage 가 SGA 에 비해 작을 경우, Hugepage 와 Normal Pages를 동시에 사용합니다.
<<HugePage Configuration 확인 방법>>
1.memlock 확인 ( /etc/security/limits.conf) RAM 크기보다 약간 작은 크기 정보로 설정됨을 확인
oracle soft memlock 88926480 ## memlock 최대 고정메모리 (max locked memory )
oracle hard memlock 88926480 ## 단위 KB
2. Oracle Product Owner, 즉 Oracle 로 loging 하여 max locked memory 값 확인
ulimit -l
88926480
3. Hugepage 설정 확인
grep Huge /proc/meminfo
<< HugePages 를 설정하는 방법>>
1. Oracle Instance 를 띄운다. 필수 AMM(Automatic Memory Management) 이 설정되어 있지않아야 함
2. MOS Note 401749.1 의 스크립트를 이용하여 적합한 Hugepage 값을 찾는다 ( 첨부 참조 )
3. 시스템 hugepages 를 설정 한다.
sysctl -w vm.nr_hugepages=9222
그리고 서버가 Reboot 되더라도 설정값이 유지 되기 위해서는 /etc/sysctl.conf 에 vmm.nr_hugepsage=9222 을 설정한다.
4. DBMS 의 USE_LARGE_PAGES=ONLY 로 설정 한 후 RESTART
5. grep Huge /proc/meminfo 명령어로 Huge page 사용량을 확인
<< HugePages 설정 테스트>>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | -- OS 메모리 확인 ( 8기가 ) [root@tggo ~]# free total used free shared buffers cached Mem: 7912632 1120856 6791776 263052 31492 755916 -/+ buffers/cache: 333448 7579184 Swap: 4184060 0 4184060 -- Oracle 유저 최대 메모리 확인 ( 8기가 ) [root@tggo ~]# cat /etc/security/limits.conf |grep memlock # - memlock - max locked-in-memory address space (KB) oracle soft memlock 8388608 oracle hard memlock 8388608 [root@tggo ~]# -- Oracle 유저 최대 메모리 확인 [TGDB]tggo:/home/oracle> ulimit -l 8388608 [TGDB]tggo:/home/oracle> -- System Hugepage 설정 확인 -- Hupgepagesize = 2048 K ( 2M ) -- HugePages_Total: 0 -- 설정도 없고, -- HugePages_Free: 0 -- 사용도 없음 확인 [TGDB]tggo:/home/oracle> grep Huge /proc/meminfo AnonHugePages: 16384 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB [TGDB]tggo:/home/oracle> -- Oracle 기동 상태 확인 -- Oracle 기동 상태에서, 메모리 사용에 맞춰, Hugepage 셋팅 값을 찾는다. [TGDB]tggo:/home/oracle> ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 32768 oracle 640 8388608 34 0x00000000 65537 oracle 640 528482304 34 0x5d9b732c 98306 oracle 640 2097152 34 [TGDB]tggo:/home/oracle> ps -ef |grep ora_ |grep smon oracle 7340 1 0 17:56 ? 00:00:00 ora_smon_TGDB [TGDB]tggo:/home/oracle> -- Oracle AMM 미설정 확인 -- Automatic Memory Management:AMM) -- memory_target 및 memory_max_target 미설정 확인 SYS@TGDB=> show parameters memory NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ hi_shared_memory_address integer 0 memory_max_target big integer 0 memory_target big integer 0 shared_memory_address integer 0 SYS@TGDB=> show parameters sga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 512M sga_target big integer 512M SYS@TGDB=> -- MOS Note 401749.1 의 쉘 수행 [TGDB]tggo:/home/oracle> sh huge.sh This script is provided by Doc ID 401749.1 from My Oracle Support (http://support.oracle.com) where it is intended to compute values for the recommended HugePages/HugeTLB configuration for the current shared memory segments on Oracle Linux. Before proceeding with the execution please note following: * For ASM instance, it needs to configure ASMM instead of AMM. * The 'pga_aggregate_target' is outside the SGA and you should accommodate this while calculating SGA size. * In case you changes the DB SGA size, as the new SGA will not fit in the previous HugePages configuration, it had better disable the whole HugePages, start the DB with new SGA size and run the script again. And make sure that: * Oracle Database instance(s) are up and running * Oracle Database 11g Automatic Memory Management (AMM) is not setup (See Doc ID 749851.1) * The shared memory segments can be listed by command: # ipcs -m Press Enter to proceed... Recommended setting: vm.nr_hugepages = 260 [TGDB]tggo:/home/oracle SGA / Huge Page = 512 M / 2 M = 256 ---> 260 -- Hugepage 설정 하기 [root@tggo ~]# cat /etc/sysctl.conf |grep huge ##hugepages vm.nr_hugepages=260 [root@tggo ~]# -- Hugepage 설정 반영 하기 [root@tggo ~]# sysctl -p net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 fs.suid_dumpable = 1 fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 536870912 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 4194304 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586 vm.nr_hugepages = 260 [root@tggo ~]# -- Hugepage 설정 반영 확인 #sysctl -a|grep nr_hugepages vm.nr_hugepages = value -- Hugepage 설정 반영 확인 -- HugePages_Total: 260 -- HugePages_Free: 260 [root@tggo ~]# grep Huge /proc/meminfo AnonHugePages: 16384 kB HugePages_Total: 260 HugePages_Free: 260 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB [root@tggo ~]# -- Hugepages 를 DB 에 반영하기 위해서, DB 재기동 SYS@TGDB=> shutdown immediate ; Database closed. Database dismounted. ORACLE instance shut down. SYS@TGDB=> startup ORACLE instance started. Total System Global Area 534462464 bytes Fixed Size 2254952 bytes Variable Size 213911448 bytes Database Buffers 314572800 bytes Redo Buffers 3723264 bytes Database mounted. Database opened. SYS@TGDB=> -- HugePage 사용 확인 [root@tggo ~]# grep Huge /proc/meminfo AnonHugePages: 14336 kB HugePages_Total: 260 HugePages_Free: 84 HugePages_Rsvd: 81 HugePages_Surp: 0 Hugepagesize: 2048 kB [root@tggo ~]# -- DB 에서 use_large_pages 파라미터 설정 -- use_large_pages 는 Linux 에서만 의미가 있음 -- TRUE - Default 11.2.0.2 - Large Page 모자란 경우, Regular Page로 할당됨 --> ORA-04030 11.2.0.3 - Large Page 모자란 경우, Huge Page + 모자란 공간은 Regular Page 로 할당됨 ( Mix Mode ) -- FALSE - Specifies that the instance will not use large pages. This setting is not recommended because it can cause severe performance degradation for the instance. -- ONLY - Specifies that the instance will fail to start if large pages cannot be used for the entire SGA memory. SYS@TGDB=> alter system set use_large_pages =Only scope=spfile ; System altered. SYS@TGDB=> shutdown immediate ; Database closed. Database dismounted. ORACLE instance shut down. SYS@TGDB=> -- DB 기동 전 Hugapage 사용량 확인 [root@tggo ~]# grep Huge /proc/meminfo AnonHugePages: 8192 kB HugePages_Total: 260 HugePages_Free: 260 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB [root@tggo ~]# SYS@TGDB=> startup ORACLE instance started. Total System Global Area 534462464 bytes Fixed Size 2254952 bytes Variable Size 213911448 bytes Database Buffers 314572800 bytes Redo Buffers 3723264 bytes Database mounted. Database opened. SYS@TGDB=> -- DB 기동 후 Hugapage 사용량 확인 [root@tggo ~]# grep Huge /proc/meminfo AnonHugePages: 14336 kB HugePages_Total: 260 HugePages_Free: 65 HugePages_Rsvd: 62 HugePages_Surp: 0 Hugepagesize: 2048 kB [root@tggo ~]# -- use_large_page =only 설정 및 재기동으로 hugepages_free 더 줄어듦 확인 ( 84 에서 65 로 변경됨 ) | cs |