zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    2018.10.22-ssoi3979荔枝丹(litchi)
    2018.10.18- oj3969 pd
    2018.10.18-ssoj3970 graph
    【2019年8月版】OCP 071认证考试原题-第38题
    【2019年8月版】OCP 071认证考试原题-第37题
    【2019年8月版】OCP 071认证考试原题-第36题
    【2019年8月版】OCP 071认证考试原题-第35题
    【2019年8月版】OCP 071认证考试原题-第34题
    【2019年8月版】OCP 071认证考试原题-第33题
    【2019年8月】OCP 071认证考试最新版本的考试原题-第32题
  • 原文地址:https://www.cnblogs.com/lipeng20004/p/13952027.html
Copyright © 2011-2022 走看看