oracle性能优化:Linux环境下合理配置大内存页(HugePage)

可参考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)

  1. 计划要设置的内存页数量。到目前为止,大内存页只能用于共享内存段等少量类型 的内存。一旦将物理内存用作大内存页,那么这些物理内存就不能用作其他用途,比如作为进程的私有内存。因此不能将过多的内存设置为大内存页。我们通常将大内存页用作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))

  1. 修改/etc/sysctl.conf文件,增加如下行:

vm.nr_hugepages=9218

然后执行sysctl –p命令,使配置生效。

这里vm.nr_hugepages这个参数值为第2步计算出的大内存页数量。然后检查/proc/meminfo,如果HugePages_Total小于设置的数量,那么表明没有足够的连续物理内存用于这些大内存页,需要重启服务器。

  1. 在/etc/security/limits.conf文件中增加如下行:

oracle soft memlock 18878464

oracle hard memlock 18878464

这里设定oracle用户可以锁定内存的大小 ,以KB为单位。

然后重新以oracle用户连接到数据库服务器,使用ulimit -a命令,可以看到:

max lockedmemory (kbytes, -l) 18878464

这里将memlock配置为unlimited也可以。

  1. 如果数据库使用MANUAL方式管理SGA,需要改为AUTO方式,即将SGA_TARGET_SIZE设置为大于0的值。对于11g,由于HugePage只能用于共享内存,不能用于PGA,所以不能使用AMM,即不能设置MEMORY_TARGET为大于0,只能分别设置SGA和PGA,SGA同样只能是AUTO方式管理。

  2. 最后启动数据库,检查/proc/meminfo中查看HugePages_Free是否已经减少。如果已经减少,表明已经使用到HugePage Memory。不过查看出故障数据库服务器上的/proc/meminfo时发现,居然没有HugePage相关的信息,sysctl -a查看所有系统参数也没有找到vm.nr_hugepages这个参数。这是由于Linux内核没有编译进HugePage这个特性。我们需要使用其他的内核来启用HugePage。

posted @ 2020-11-10 08:42  武汉OracleDBA  阅读(2175)  评论(0编辑  收藏  举报