暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

关于HugePages

db小强 2021-04-20
477

介绍

HugePagesLinux内核2.6+集成的一个功能,可以允许管理大于4KB的页。

相关概念

  • Page Table:页表是操作系统存储的虚拟地址和物理地址的映射的数据结构.

  • TLB: A Translation Lookaside Buffer (TLB),是CPU的一个固定大小的buffer,缓存了部分内存页表,可以更快进行虚拟地址转换。

  • hugetlb: TLB中指向HugePage的入口,通常等同于HugePage

  • hugetlbfs: 2.6内核中新的像tmpfs的内存文件系统

为什么需要

如果你使用大内存及大的SGA,那HugePages是加快数据库性能的重要因素,优点如下:

  • 页变大页数变少: 默认页是4K,而HugePageTLB2048K,意味着页数少512

  • 减少页表 Walking

  • 更少的内存操作成本

  • 更少的内存使用

  • 没有内存交换

  • 没有 'kswapd' 操作:正常页kswapd 会占用大量CPU资源(i.e. 13 million page table     entries for 50GB memory). 而使用HugePages,则不需要。

如何配置

Step 1: vi/etc/security/limits.conf   单位KB,设置比SGA大没问题。使用oracle-validated包和exadata默认会被设置。也可以在etc/security/limits.d/  目录下设置。

*  soft   memlock    60397977
*   hard   memlock    60397977

Step 2: 重新登陆oracle,check

$ ulimit -l
60397977

Step 3: AMM同hugepages不兼容,需先禁用(11.2.0.3+默认不配置AMM),不然会有如下报错:

ORA-00845:MEMORY_TARGET not supported on this system

 Step4: 开启数据库实例,包括ASM,使用如下脚本计算vm.nr_hugepages:

$ ./hugepages_settings.sh
...
Recommended setting: vm.nr_hugepages = 1496
$

Step 5: vi etc/sysctl.conf  设置 vm.nr_hugepagessysctl -p:

...
vm.nr_hugepages = 1496
...

Step6: 停实例,重启server(最佳实践建议重启)系统重启后,启动实例,检查是否生效, HugePages_Free value应该小于HugePages_Total:

# grep HugePages/proc/meminfo
HugePages_Total:    1496
HugePages_Free:      485
HugePages_Rsvd:      446
HugePages_Surp:        0

如果所有oracle实例PRE_PAGE_SGA参数是false,参数HugePages_Rsvd>012.1之前该参数默认false,12.1开始该参数默认为true

NOTES

HugePages配置基于内在和运行实例的SGA,如下变化需重新配置

  • OS总内存变化

  • 添加新实例

  • 实例SGA变化

如下情况需要评估HugePages配置是否合适:

  • 数据库性能很差

  • 系统OOM或过多swapping

  • 实例不能启动

  • 重要的服务失败



参考:mos 361468.1

附:hugepages_settings.sh

    #!/bin/bash
    #
    # hugepages_settings.sh
    #
    # Linux bash script to compute values for the
    # recommended HugePages/HugeTLB configuration
    #
    # 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. 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" ;;
    esac
    # End


    文章转载自db小强,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论