Hugepages与Transparent HugePages配置对Oracle影响

概述

某几位朋友查看完Oracle RAC环境构筑文章时,他们都问到一件事情。为什么我没有记载HugePages(标准大页)与Transparent HugePages(透明大页)相关的配置信息?Oracle官方不是强烈建议我们将相关参数进行修改吗?它们是什么东西呢?

操作系统中,内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为4096 bytes即4K。CPU处理器有内置的内存管理单元,包含这些页面的列表,每个页面通过页表条目引用。当内存越来越大的时候,CPU处理器需要管理这些内存页的成本也就越高,这样会对操作系统的性能产生影响。它有两种不同的方式:

  • HugePages(标准大页) => Oracle官方推荐使用方法
    Huge pages 是从Linux Kernel 2.6后被引入的,目的是通过使用大页内存来取代传统的4kb内存页面,以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。
    Huge pages 有两种格式大小:2MB 和 1GB,2MB页块大小适合用于GB大小的内存,1GB页块大小适合用于TB级别的内存;2MB是默认的页大小。

  • Transparent HugePages(透明大页) => Oracle官方不推荐使用方法
    Transparent Huge Pages 缩写 THP,这个是RHEL 6开始引入的一个功能,在Linux6上透明大页是默认启用的。
    由于Huge pages很难手动管理,而且通常需要对代码进行重大的更改才能有效的使用,因此RHEL 6开始引入了Transparent Huge Pages(THP),THP是一个抽象层,能够自动创建、管理和使用传统大页。
    THP为系统管理员和开发人员减少了很多使用传统大页的复杂性, 因为THP的目标是改进性能, 因此其它开发人员 (来自社区和红帽) 已在各种系统、配置、应用程序和负载中对 THP 进行了测试和优化。这样可让 THP 的默认设置改进大多数系统配置性能。但是, 不建议对数据库工作负载使用 THP。

这两者区别在于: 标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。

HugePages相关

HugePages优势

  • 通过增加TLB(Translation Lookaside Buffer)撞击率来提高性能
  • 可以提高oracle的性能,减少oracle sga的页交换

HugePages缺点

  • 开启该功能需要进行额外设置
  • Huge pages 和Oracle 11g性特性AMM(Automatic Memory Management)是相互冲突,但ASMM(AutomaticShared Memory Management)不受影响

HugePages操作

  • HugePages配置查询
grep Huge /proc/meminfo
AnonHugePages:    585728 kB
HugePages_Total:       0   => 没有配置hugepages
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB => 查看标准大页(Huage Pages)的页面大小

cat /proc/sys/vm/nr_hugepages
0 => 0 表示没有配置
  • Oracle实例内存锁定
# 实例配置
alter system set lock_sga=true scope=spfile;
alter system set pre_page_sga=true scope=spfile;
# 重启实例应用配置
shutdown immediate
startup
  • Oracle官方推荐脚本计算HugePages大小
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
# on Oracle Linux
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
#
# This script is provided by Doc ID 401749.1 from My Oracle Support 
# http://support.oracle.com

# Welcome text
echo "
This script is provided by Doc ID 401749.1 from My Oracle Support 
(http://support.oracle.com) where it is intended to compute values for 
the recommended HugePages/HugeTLB configuration for the current shared 
memory segments on Oracle Linux. Before proceeding with the execution please note following:
 * For ASM instance, it needs to configure ASMM instead of AMM.
 * The 'pga_aggregate_target' is outside the SGA and 
   you should accommodate this while calculating SGA size.
 * In case you changes the DB SGA size, 
   as the new SGA will not fit in the previous HugePages configuration, 
   it had better disable the whole HugePages, 
   start the DB with new SGA size and run the script again.
And make sure that:
 * Oracle Database instance(s) are up and running
 * Oracle Database 11g Automatic Memory Management (AMM) is not setup 
   (See Doc ID 749851.1)
 * The shared memory segments can be listed by command:
     # ipcs -m


Press Enter to proceed..."

read

# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`

# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`
if [ -z "$HPG_SZ" ];then
    echo "The hugepages may not be supported in the system where the script is being executed."
    exit 1
fi

# Initialize the counter
NUM_PG=0

# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | cut -c44-300 | awk '{print $1}' | grep "[0-9][0-9]*"`
do
    MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
    if [ $MIN_PG -gt 0 ]; then
        NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
    fi
done

RES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`

# An SGA less than 100MB does not make sense
# Bail out if that is the case
if [ $RES_BYTES -lt 100000000 ]; then
    echo "***********"
    echo "** ERROR **"
    echo "***********"
    echo "Sorry! There are not enough total of shared memory segments allocated for 
HugePages configuration. HugePages can only be used for shared memory segments 
that you can list by command:

    # ipcs -m

of a size that can match an Oracle Database SGA. Please make sure that:
 * Oracle Database instance is up and running 
 * Oracle Database 11g Automatic Memory Management (AMM) is not configured"
    exit 1
fi

# Finish with results
case $KERN in
    '2.2') echo "Kernel version $KERN is not supported. Exiting." ;;
    '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
           echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
    '2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '3.10') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '4.1') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
esac

# End
  • sysctl参数配置
{
    
    
echo
echo \#\#  Changes done for to support Oracle RAC
echo "oracle        soft    memlock        unlimited"
echo "oracle        hard    memlock        unlimited"
echo \#\# End
echo
} >> /etc/security/limits.conf

{
    
    
echo 
echo \#\#  Changes done for to support Oracle RAC
echo "vm.nr_hugepages = HugePages_Total_Value" => 注意修改此值
echo \#\# End
echo
} > /etc/sysctl.d/97-oracle-database-sysctl.conf
/sbin/sysctl --system
/sbin/sysctl -p
  • 重启系统及数据库

HugePages注意

  • HugePages配置时,它的容量必须要比Oracle SGA配置大,否则将会导致HugePages无法适用。它稍微比SGA大一点即可,不需要大很多的。
  • limits.conf配置里memlock也需要注意配置大小,可以将此参数设置为unlimited。它的检查方法是ulimit -l

Transparent HugePages相关

Transparent HugePages缺点

  • 在RAC环境下Transparent HugePages(透明大页)会导致异常节点重启和性能问题;
  • 在单机环境中,Transparent HugePages(透明大页)会导致一些异常的性能问题;

Transparent HugePages操作

  • 查询功能状态
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

always => 表示启用透明大页; never => 表示关闭透明大页;madvise => 表示只在MADV_HUGEPAGE标志的VMA中使用THP;

  • CentOS / Redhat 7关闭THP功能
# 编辑启动参数
vi /etc/sysconfig/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
# 增加参数"transparent_hugepage=never"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos_racnode01/root rd.lvm.lv=centos_racnode01/swap rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"

# grub2重配置
grub2-mkconfig -o /boot/grub2/grub.cfg (On BIOS-based machines)
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg (On UEFI-based machines)

# 重启操作系统
init 6
# 检查参数效果
cat /proc/cmdline

参考MOS

  • HugePage说明详见:HugePages on Oracle Linux 64-bit (文档 ID 361468.1)

  • AMM & oracle兼容性详见:HugePages and Oracle Database 11g Automatic Memory Management (AMM) on Linux (文档 ID 749851.1)

  • HugePage大小获取脚本:Oracle Linux: Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (文档 ID 401749.1)

  • HugePageSize大小:HugePages on Linux: What It Is… and What It Is Not… (文档 ID 361323.1)

猜你喜欢

转载自blog.csdn.net/weixin_38623994/article/details/106629937
今日推荐