Permanently disable Transparent Hugepages (THP) on OEL 8.8 using GRUB2 and Configuring HugePages for Oracle
OEL 8.8 환경에서 grub2 를 이용하여 THP 를 영구적으로 비활성화하고 Oracle Hugepages 를 설정하는 방법을 소개한다.
Oracle 에서는 RAC, Single Instance 모두 disable THP 을 강력하게 권고한다. 아래의 내용은 Oracle Doc Id 문서의 일부이다. 저자는 THP 가 Oracle Hugepages 설정을 위해서 enable이 필요하고 Oracle 권고도 enable 이라는 터무니없는 잘못된 정보를 최근 다른 DBA 에게 들었다. THP 와 Oracle Hugepages 설정은 서로 연관이 없고 Oracle 권고 또한 disable THP 이다.
++ ALERT: Disable Transparent HugePages on SLES11, RHEL6, RHEL7, RHEL8, OL6, OL7, OL8 and UEK2 and above ( Doc ID 1557478.1 )
//
Because Transparent HugePages are known to cause unexpected node reboots and performance problems with RAC,
Oracle strongly advises to disable the use of Transparent HugePages.
In addition, Transparent Hugepages may cause problems even in a single-instance database environment with unexpected performance problems or delays.
As such, Oracle recommends disabling Transparent HugePages on all Database servers running Oracle.
//
---------------------------------------------------------------------------------------
-- (OS) Disable Transparent Huge Pages
---------------------------------------------------------------------------------------
-- Check OS Version
root> uname -a
Linux {hostname} 4.18.0-477.10.1.el8_8.x86_64
-- Check Transparent Huge Pages
-- always 는 THP 가 enable 상태이다.
root> cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
-- AnonHugePages 가 0 보다 크면 THP 는 enable 상태이다.
root> grep AnonHugePages /proc/meminfo
AnonHugePages: 335872 kB
-- 현재 시점에서 이미 AnonHugepages 가 사용 중이므로
-- /sys/kernel/mm/transparent_hugepage/enabled always 를 never 로 바꿔도 의미가 없다.
-- Permanently disable TransParent HugePages using GRUB2
-- Get GRUB2 kernel parameter list (결과는 사용자 환경마다 다름)
root> grub2-editenv - list | grep kernelopts
kernelopts=root=/dev/mapper/rootvg-root ro crashkernel=auto resume=/dev/mapper/rootvg-swap rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/swap rhgb quiet
-- Update GRUB2 to disable Transparent HugePages (THP)
+ 위의 grub2-editenv - list | grep kernelopts 결과(결과는 사용자 환경마다 다름)에서 맨 뒤에 transparent_hugepage=never 를 추가한다.
root> grub2-editenv - set "kernelopts=root=/dev/mapper/rootvg-root ro crashkernel=auto resume=/dev/mapper/rootvg-swap rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/swap rhgb quiet transparent_hugepage=never"
root> grub2-editenv - list | grep kernelopts
kernelopts=root=/dev/mapper/rootvg-root ro crashkernel=auto resume=/dev/mapper/rootvg-swap rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/swap rhgb quiet transparent_hugepage=never
-- Next Reboot (서버를 재기동하여 영구적으로 disable 처리가 됬는지 확인한다.)
root> reboot
-- Check Transparent Huge Pages
-- never 는 THP 가 disable 상태이다.
root> cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
-- AnonHugePages 가 0 이므로 THP 는 disable 상태이다.
root> grep AnonHugePages /proc/meminfo
AnonHugePages: 0 kB
---------------------------------------------------------------------------------------
-- (DB) Configure Oracle Huge Pages
---------------------------------------------------------------------------------------
-- Check OS Memory
root> free -m
OS Total Mem : 15720 MB (about 15.3 GB)
-- Check OS User
grid : GRID User
oracle : ORACLE User
-- DB Parameter (sga_max_size+pga_aggregate_limit = 13GB 로 총 메모리의 최대 86%까지 사용)
sga_target, sga_max_size : 7 GB (총 15.3 GB 에서 50% 할당)
pga_aggregate_target : 3G (총 15.3 GB 에서 20% 할당)
pga_aggreaget_limit : 6G (pga_aggregate_target*2)
-- Configure memlock (File Name : /etc/security/limits.conf)
+ grid, oracle OS User memory max limit 15G 로 설정하였다.
+ memlock 은 Doc ID 2511230.1 에서 아래의 내용와 같이 표현했듯이 크게 설정해도 상관없다.
+ "There is no impact in setting a higher value (less than RAM size)."
root> vi /etc/security/limits.conf
... (omitted)
grid hard memlock 15728640
grid hard memlock 15728640
... (omitted)
oracle hard memlock 15728640
oracle hard memlock 15728640
... (omitted)
-- Check memlock
root> su - grid
grid> ulimit -l
15728640
root> su - oracle
oracle> ulimit -l
15728640
+ Ref. Oracle Linux: What is Memlock and How to Calculate the Values for Memlock? ( Doc ID 2511230.1 )
-- Configure kernel (File Name : /etc/sysctl.conf)
+ kernel.shmmax : 12 GB (일반 가이드는 OS Memory*0.5 이나, sga_max_size 7 GB를 고려하여 OS Memory*0.8 로 지정)
+ kerne.shmall : kernel.shmmax/OS pagesize (OS pagesize = 4 KB, root> getconf PAGE_SIZE)
+ vm.nr_hugepages : 3840 ((7GB+0.5GB)*1024*1024 / 2048 KB)
- (nr_hugepages 설정은 sga_max_size 보다 좀더 크게 잡는다. 저자는 sga_max_size+0.5GB 로 설정)
- (2048 KB 는 Hugepagesize 이다, root> grep Hugepagesize /proc/meminfo)
root> vi /etc/sysctl.conf
... (omitted)
kernel.shmmax = 12884901888
kernel.shmall = 3145728
vm.nr_hugepages = 3840
... (omitted)
-- apply Configure kernel
root> sysctl -p
-- Configure Oracle parameter
-- use_large_pages = ONLY 로 설정해야 Oracle Huge pages 를 사용할 수 있다.
oracle> sqlplus / as sysdba
sql> alter system set use_large_pages=ONLY scope=spfile sid='*';
sql> shutdown
sql> startup
sql> show parameter use_large_pages
NAME TYPE VALUE
--------------- ----- -----
use_large_pages string ONLY
-- Check for the hugepages usage
root> grep Huge /proc/meminfo
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 3840
HugePages_Free: 254
HugePages_Rsvd: 0
HugePages_Surp: 0
HugePagesize: 2048 kB
Hugetlb: 7864320 kB
Oracle alert_{ORACLE_SID}.log
*********************************************************************
PAGESIZE AVAILABLE_PAGES EXPTECTED_PAGES ALLOCATED_PAGES ERROR(s)
2048K 3840 3586 3586 NONE
*********************************************************************
댓글