oracle性能优化:Linux环境下合理配置⼤内存页(HugePage)可参考oracle MOS 相关⽂档或Oracle官⽅Grid安装指导⼿册。
Best Practices and Recommendations for RAC databases with SGA size over 100GB (⽂档 ID 1619155.1)
安装Oracle数据库都建议关闭透明⼤页
1 THP 背景知识补充说明
在Linux6.x之后的平台,在安装Oracle数据库的时候都建议关闭透明⼤页。之前也写过⼀篇关于透明⼤页的⽂章:
Linux Transparent Huge Pages 对 Oracle 的影响
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 的影响
这⾥补充⼀下Linux 7.4中的关闭⽅法。当然Oracle Linux 默认已经关闭了THP,可以不⽤再进⾏关闭,但如果是Redhat 6,7,SUSE 11那么还是需要⼿⼯来操作的。
⾸先检查THP是否启动:
[dave@wwwdba ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.4 (Maipo)
[dave@wwwdba ~]# uname -r
3.10.0-693.el7.x86_64
[dave@wwwdba ~]# 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@wwwdba ~]#
[dave@wwwdba ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[dave@wwwdba ~]#
注意:如果没有这个⽂件,那么检查:
/sys/kernel/mm/redhat_transparent_hugepage/enabled
如果/sys/kernel/mm/transparent_hugepage 和 /sys/kernel/mm/redhat_transparent_hugepage 2个⽂件都不存在,那么就是在系统内核中移除了THP。
Linux 6
在Linux 6或者更早的版本中按以下步骤禁⽤:
在f ⽂件中添加:transparent_hugepage=never。这种⽅法在修改后需要重启OS才能⽣效。
[root@wwwdba ~]# cat /f
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
linux安装数据库boot=/dev/sda1
device (hd0) HD(1,800,3e8000,ad383463-7239-443a-83c6-7b8c6539a458)
default=0
timeout=5
splashimage=(hd0,1)/grub/
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@wwwdba ~]# 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@wwwdba 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@wwwdba grub2]#
[dave@wwwdba grub.d]# reboot
--验证:成功关闭
[dave@wwwdba ~]# 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@wwwdba ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[dave@wwwdba ~]#
>>>>>>>>>>>>#
性能优化: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))
2. 修改/f⽂件,增加如下⾏:
<_hugepages=9218
然后执⾏sysctl –p命令,使配置⽣效。
这⾥vm.nr_hugepages这个参数值为第2步计算出的⼤内存页数量。然后检查/proc/meminfo,如果HugePages_Total⼩于设置的数量,那么表明没有⾜够的连续物理内存⽤于这些⼤内存页,需要重启服务器。
3. 在/etc/f⽂件中增加如下⾏:
oracle soft memlock 18878464
oracle hard memlock 18878464
这⾥设定oracle⽤户可以锁定内存的⼤⼩,以KB为单位。
然后重新以oracle⽤户连接到数据库服务器,使⽤ulimit -a命令,可以看到:
max lockedmemory (kbytes, -l) 18878464
这⾥将memlock配置为unlimited也可以。
4. 如果数据库使⽤MANUAL⽅式管理SGA,需要改为AUTO⽅式,即将SGA_TARGET_SIZE设置为⼤于0的值。对于11g,由于
HugePage只能⽤于共享内存,不能⽤于PGA,所以不能使⽤AMM,即不能设置MEMORY_TARGET为⼤于0,只能分别设置SGA和PGA,SGA同样只能是AUTO⽅式管理。
5. 最后启动数据库,检查/proc/meminfo中查看HugePages_Free是否已经减少。如果已经减少,表明已经使⽤到HugePage Memory。
不过查看出故障数据库服务器上的/proc/meminfo时发现,居然没有HugePage相关的信息,sysctl -a查看所有系统参数也没有到vm.nr_hugepages这个参数。这是由于Linux内核没有编译进HugePage这个特性。我们需要使⽤其他的内核来启⽤HugePage。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论