可參考oracle MOS 相關文檔或Oracle官方Grid安裝指導手冊。
Best Practices and Recommendations for RAC databases with SGA size over 100GB (文檔 ID 1619155.1)
安裝Oracle數據庫都建議關閉透明大頁
https://www.cndba.cn/dave/article/2673
1 THP 背景知識補充說明
在Linux6.x之后的平台,在安裝Oracle數據庫的時候都建議關閉透明大頁。之前也寫過一篇關於透明大頁的文章:
Linux Transparent Huge Pages 對 Oracle 的影響
http://www.cndba.cn/dave/article/312
Linux下的大頁分為兩種類型:標准大頁(Huge Pages)和透明大頁(Transparent Huge Pages)。
1.1). 標准大頁(Huge Pages)是從Linux Kernel 2.6后被引入的。目的是使用更大的內存頁面(memory page size) 以適應越來越大的系統內存,讓操作系統可以支持現代硬件架構的大頁面容量功能。
2.2). 透明大頁(Transparent Huge Pages)縮寫為THP,這個是RHEL 6開始引入的一個功能。
這兩者的區別在於大頁的分配機制,標准大頁管理是預分配的方式,而透明大頁管理則是動態分配的方式。目前透明大頁與傳統大頁混合使用會出現一些問題,導致性能問題和系統重啟。ORACLE官方不建議在使用RedHat 6, OEL 6, SLES 11 and UEK2 kernels 時開啟透明大頁(THP), 因為透明大頁存在一些問題:
1.在RAC環境下 透明大頁(Transparent HugePages )會導致異常節點重啟和性能問題;
2.在單機環境中,透明大頁(Transparent HugePages ) 也會導致一些異常的性能問題;
2 關閉THP
在之前的文章中我們演示了在Linux 6.x 中關閉透明大頁的方法:
Linux Transparent Huge Pages 對 Oracle 的影響
http://www.cndba.cn/dave/article/312
這里補充一下Linux 7.4中的關閉方法。 當然Oracle Linux 默認已經關閉了THP,可以不用再進行關閉,但如果是Redhat 6,7,SUSE 11 那么還是需要手工來操作的。
首先檢查THP是否啟動:
[dave@www.cndba.cn ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.4 (Maipo)
[dave@www.cndba.cn ~]# uname -r
3.10.0-693.el7.x86_64
[dave@www.cndba.cn ~]# uname -a
Linux dave 3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux
[dave@www.cndba.cn ~]#
[dave@www.cndba.cn ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[dave@www.cndba.cn ~]#
注意:如果沒有這個文件,那么檢查:
/sys/kernel/mm/redhat_transparent_hugepage/enabled
如果/sys/kernel/mm/transparent_hugepage 和 /sys/kernel/mm/redhat_transparent_hugepage 2個文件都不存在,那么就是在系統內核中移除了THP。
Linux 6
在Linux 6或者更早的版本中按以下步驟禁用:
在grub.conf 文件中添加:transparent_hugepage=never。 這種方法在修改后需要重啟OS才能生效。
[root@www.cndba.cn ~]# cat /etc/grub.conf
grub.conf generated by anaconda
Note that you do not have to rerun grub after making changes to this file
NOTICE: You have a /boot partition. This means that
all kernel and initrd paths are relative to /boot/, eg.
root (hd0,1)
kernel /vmlinuz-version ro root=/dev/sda4
initrd /initrd-[generic-]version.img
boot=/dev/sda1
device (hd0) HD(1,800,3e8000,ad383463-7239-443a-83c6-7b8c6539a458)
default=0
timeout=5
splashimage=(hd0,1)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-573.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=65b6fe1a-6897-4a16-9cf6-e8dfcc89b7ce rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet transparent_hugepage=never
initrd /initramfs-2.6.32-573.el6.x86_64.img
linux 7
在Linux 7 之后,需要修改/etc/default/grub文件,添加transparent_hugepage=never,然后執行grub2-mkconfig,最后在重啟系統:
[dave@www.cndba.cn ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"
[dave@www.cndba.cn grub2]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-4ea362360a8f4c5388edf0ad788ae256
Found initrd image: /boot/initramfs-0-rescue-4ea362360a8f4c5388edf0ad788ae256.img
done
[dave@www.cndba.cn grub2]#
[dave@www.cndba.cn grub.d]# reboot
--驗證:成功關閉
[dave@www.cndba.cn ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-693.el7.x86_64 root=UUID=b9ab8ce8-a487-4046-947f-1f80d2feb9d4 ro crashkernel=auto rhgb quiet transparent_hugepage=never
[dave@www.cndba.cn ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[dave@www.cndba.cn ~]#
#############################################################
https://www.cnblogs.com/lhrbest/p/5866284.html
性能優化:Linux環境下合理配置大內存頁(HugePage)
- 計划要設置的內存頁數量。到目前為止,大內存頁只能用於共享內存段等少量類型 的內存。一旦將物理內存用作大內存頁,那么這些物理內存就不能用作其他用途,比如作為進程的私有內存。因此不能將過多的內存設置為大內存頁。我們通常將大內存頁用作Oracle數據庫的SGA,那么大內存頁數量:
HugePages_Total=ceil(SGA_MAX_SIZE/Hugepagesize)+N
比如,為數據庫設置的SGA_MAX_SIZE為18GB,那么頁面數可以為ceil(18*1024/2)+2=9218。這里加上N,是需要將HugePage內存空間設置得比SGA_MAX_SIZE稍大,通常為1-2即可。我們通過ipcs -m命令查看共享內存段的大小,可以看到共享內存段的大小實際上比SGA_MAX_SIZE約大。如果服務器上有多個Oracle實例,需要為每個實例考慮共享內存段多出的部分,即N值會越大。另外,Oracle數據庫要么全部使用大內存頁,要么完全不使用大內存頁,因此不合適的HugePages_Total將造成內存的浪費。
除了使用SGA_MAX_SIZE計算,也可以通過ipcs -m所獲取的共享內存段大小計算出更准確的HugePages_Total。
HugePages_Total=sum(ceil(share_segment_size/Hugepagesize))
- 修改/etc/sysctl.conf文件,增加如下行:
vm.nr_hugepages=9218
然后執行sysctl –p命令,使配置生效。
這里vm.nr_hugepages這個參數值為第2步計算出的大內存頁數量。然后檢查/proc/meminfo,如果HugePages_Total小於設置的數量,那么表明沒有足夠的連續物理內存用於這些大內存頁,需要重啟服務器。
- 在/etc/security/limits.conf文件中增加如下行:
oracle soft memlock 18878464
oracle hard memlock 18878464
這里設定oracle用戶可以鎖定內存的大小 ,以KB為單位。
然后重新以oracle用戶連接到數據庫服務器,使用ulimit -a命令,可以看到:
max lockedmemory (kbytes, -l) 18878464
這里將memlock配置為unlimited也可以。
-
如果數據庫使用MANUAL方式管理SGA,需要改為AUTO方式,即將SGA_TARGET_SIZE設置為大於0的值。對於11g,由於HugePage只能用於共享內存,不能用於PGA,所以不能使用AMM,即不能設置MEMORY_TARGET為大於0,只能分別設置SGA和PGA,SGA同樣只能是AUTO方式管理。
-
最后啟動數據庫,檢查/proc/meminfo中查看HugePages_Free是否已經減少。如果已經減少,表明已經使用到HugePage Memory。不過查看出故障數據庫服務器上的/proc/meminfo時發現,居然沒有HugePage相關的信息,sysctl -a查看所有系統參數也沒有找到vm.nr_hugepages這個參數。這是由於Linux內核沒有編譯進HugePage這個特性。我們需要使用其他的內核來啟用HugePage。