Oracle/Oh Oracle

Oracle Linux Huge Page

darkturtle26 2018. 3. 22. 14:07

hugepages_settings.sh


<<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