运维开发网

Huge pages (标准大页)和 Transparent Huge pages(透明大页)

运维开发网 https://www.qedev.com 2021-04-14 15:45 出处:51CTO 作者:小麦苗DB宝
Huge pages (   标准大页   )   和    Transparent Huge pages(   透明大页   )在  Linux  中大页分为两种:  Huge pages (  标准大页  )  和   Transparent Huge pages(  透明大页  )  。内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为  4096 bytes  即  4K  。

Huge pages (   标准大页   )   和    Transparent Huge pages(   透明大页   )

在  Linux  中大页分为两种:  Huge pages (  标准大页  )  和   Transparent Huge pages(  透明大页  )  。

内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为  4096 bytes  即  4K  。  1MB  内存等于  256  页;  1GB  内存等于  256000  页。

CPU  拥有内置的内存管理单元,包含这些页面的列表,每个页面通过页表条目引用。当内存越来越大的时候,  CPU  需要管理这些内存页的成本也就越高,这样会对操作系统的性能产生影响。

Huge Pages    

Huge pages   是从  Linux Kernel 2.6  后被引入的,目的是通过使用大页内存来取代传统的  4kb  内存页面,   以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。

Huge pages    有两种格式大小:   2MB    和    1GB   ,   2MB   页块大小适合用于   GB   大小的内存,   1GB   页块大小适合用于   TB   级别的内存;   2MB   是默认的页大小。

Transparent Huge Pages    

Transparent Huge Pages   缩写   THP  ,这个是  RHEL 6  开始引入的一个功能,在  Linux6  上透明大页是默认启用的。

由于  Huge pages  很难手动管理,而且通常需要对代码进行重大的更改才能有效的使用,因此  RHEL 6  开始引入了  Transparent Huge Pages  (  THP  ),  THP  是一个抽象层,能够自动创建、管理和使用传统大页。

THP  为系统管理员和开发人员减少了很多使用传统大页的复杂性  ,   因为  THP  的目标是改进性能  ,   因此其它开发人员   (  来自社区和红帽  )   已在各种系统、配置、应用程序和负载中对   THP   进行了测试和优化。这样可让   THP   的默认设置改进大多数系统配置性能。但是  ,   不建议对数据库工作负载使用   THP  。

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

标准大页的页面大小

[oracle@we2db1 ~]$ grep Hugepagesize /proc/meminfo

Hugepagesize:       2048 kB

 

注:  THP   目前只能映射异步内存区域,比如堆和栈空间

 

Oracle   官方是推荐我们使用  Huge pages  的,它拥有以下的好处:

 

  • Larger Page Size and Less # ofPages: Default page size is 4K whereas the HugeTLB size is 2048K. That meansthe system would need to handle 512 times less pages.

 

  • Reduced Page Table Walking:Since a HugePage covers greater contiguous Virtual address range than a regularsized page, a probability of getting a TLB hit per TLB entry with HugePages arehigher than with regular pages. This reduces the number of times page tablesare walked to obtain physical address from a Virtual address.

 

  • Less Overhead for MemoryOperations: On Virtual memory systems (any modern OS) each memory operation isactually two abstract memory operations. With HugePages, since there are lessnumber of pages to work on, the possible bottleneck on page table access isclearly avoided.

 

  • Less Memory Usage: From theOracle Database perspective, with HugePages, the Linux kernel will use lessmemory to create pagetables to maintain Virtual to physical mappings for SGAaddress range, in comparison to regular size pages. This makes more memory tobe available for process-private computations or PGA usage.

 

  • No Swapping: We must avoidswapping to happen on Linux OS at all Document 1295478.1. HugePages are notswappable (whereas regular pages are). Therefore there is no page replacementmechanism overhead. HugePages are universally regarded as pinned.

 

  • No 'kswapd' Operations: kswapdwill get very busy if there is a very large area to be paged (i.e. 13 millionpage table entries for 50GB memory) and will use an incredible amount of CPUresource. When HugePages are used, kswapd is not involved in managing them. Seealso Document 361670.1

 

当然使用   Huge pages   也会存在某些缺点:

首先开启该功能需要进行额外设置,

第二,  Huge pages   和  Oracle 11g新  特性  AMM  (  Automatic Memory Management  )是相互冲突的,但是  ASMM  (  Automatic Shared Memory Management  )仍然可以继续使用。

 

Oracle  官方虽然推荐我们使用   Huge pages  ,但是却建议我们关闭  Transparent Huge pages  ,因为透明大页存在一些问题:

 

1.  在  RAC  环境下     透明大页(  TransparentHugePages   )会导致异常节点重启,和性能问题;

 

2.  在单机环境中,透明大页(  TransparentHugePages   )   也会导致一些异常的性能问题;

 

注:Transparent Huge Pages在32位的RHEL 6中是不支持的。

禁用trasnparent hugepage    

查看透明大页是否已经启用

[root@we2db2 ~]# cat /etc/issue

Red Hat Enterprise Linux Server release 6.9(Santiago)

Kernel \r on an \m

 

[root@we2db2 ~]# cat/sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]

 

使用命令查看时,如果输出结果为   [always]   表示透明大页启用了。

[never]   表示透明大页禁用、   [madvise]   表示(只在  MADV_HUGEPAGE  标志的  VMA  中使用  THP  。

这里已经禁用了,若未禁用可以使用以下方式禁用

 

[root@we2db2 ~]# more /etc/grub.conf

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grubafter making changes to this file

# NOTICE: You have a /boot partition.  Thismeans that

#         all kernel and initrd paths are relative to /boot/, eg.

#         root (hd0,0)

#         kernel /vmlinuz-version ro root=/dev/mapper/rootvg-lv_root

#         initrd /initrd-[generic-]version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title Red Hat Enterprise Linux 6(2.6.32-696.20.1.el6.x86_64)

       root (hd0,0)

       kernel /vmlinuz-2.6.32-696.20.1.el6.x86_64 ro root=/dev/mapper/rootvg-lv_root  transparent_hugepage=never    rd_NO_LUKS.UTF-8 rd_LVM_L

V=rootvg/lv_swap rd_NO_MDSYSFONT=latarcyrheb-sun16 rd_LVM_LV=rootvg/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgbquiet

       initrd /initramfs-2.6.32-696.20.1.el6.x86_64.img

        

配置huge page    

1.   在  /etc/security/limits.conf  加入以下参数

 

*  soft   memlock    8193024

*  hard   memlock    8193024

 

 

这里的试验环境是  8G   的内存,  memlock   参数的值只需略小于内存的值即可,即使超过了  SGA  的需求,也没有任何影响。

 

 

[root@we2db1 ~]# cat /etc/security/limits.conf

 

*  soft   memlock    8193024

*  hard   memlock    8193024

 

 

2.  重新登录服务器验证设置

 

[root@we2db1 ~]# ulimit -l

8193024

 

3.  在  Oracle 11g  中禁用   AutomaticMemory Management (AMM)  特性,即  MEMORY_TARGET and MEMORY_MAX_TARGET   值为   。

 

SQL> show parameter MEMORY_TARGET

 

NAME                                 TYPE        VALUE

----------------------------------------------- ------------------------------

memory_target                        big integer 0

SQL> show parameter MEMORY_MAX_TARGET

 

NAME                                 TYPE        VALUE

----------------------------------------------- ------------------------------

memory_max_target                    big integer 0

 

这里试验环境并没有启用  AMM  特性,如果启用了该特性使用一下语句关闭。

 

alter system setMEMORY_TARGET=0 scope=spfile;

alter system setMEMORY_MAX_TARGET=0 scope=spfile;

 

重启实例后生效。

 

4.  确认所有需要使用  Hugepage  的实例都是开启的  (  包括  ASM  实例  )  ,然后运行  hugepages_settings.sh(  具体脚本参考文档    ID 401749.1  )

 

[root@we2db1 ~]# chmod +xhugepages_settings.sh

[root@we2db1 ~]# ./hugepages_settings.sh

 

This script is provided by Doc ID 401749.1from My Oracle Support

(http://support.oracle.com) where it isintended to compute values for

the recommended HugePages/HugeTLBconfiguration for the current shared

memory segments on Oracle Linux. Beforeproceeding 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.

 * Incase you changes the DB SGA size,

   asthe new SGA will not fit in the previous HugePages configuration,

   ithad 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...

 

Recommended setting:vm.nr_hugepages = 1204

 

5.  在   /etc/sysctl.conf   文件中添加  vm.nr_hugepages  参数

 

[root@we2db1 ~]# cat /etc/sysctl.conf |grep nr_hugepages

vm.nr_hugepages = 1204

[root@we2db2 ~]# cat /etc/sysctl.conf |grep nr_hugepages

vm.nr_hugepages = 1204

 

6.  关闭所有数据库实例并重启服务器

 

7.  验证配置是否正确,如下所示:

 

[root@we2db2 ~]# grep HugePages  /proc/meminfo

AnonHugePages:         0 kB

HugePages_Total:    1204

HugePages_Free:      739

HugePages_Rsvd:      736

HugePages_Surp:        0

 

为了确保  HugePages  配置的有效性,  HugePages_Free  值应该小于  HugePages_Total   的值,并且有一定的  HugePages_Rsvd  的值。

 

Also there should be some HugePages_Rsvd ifPRE_PAGE_SGA is 'false' for all the Oracle database instances..

HugePages_Rsvd counts free pages that arereserved for use (requested for an SGA, but not touched/mapped yet).

PRE_PAGE_SGA determines if the all SGApages are read-in when the instance starts up.

If parameter is set to 'true' then the OSpage table entries are prebuilt for each page of the SGA, leading to HugePagesreservation of those pages.

For Oracle database versions before 12.1the default value for PRE_PAGE_SGA is 'false'. So the HugePages_Rsvd would behigher than 0. But since 12c the PRE_PAGE_SGA defaults to 'true' which wouldcause the HugePages_Rsvd to be 0.

 

The sum of Hugepages_Free andHugePages_Rsvd may be smaller than your total combined SGA as instancesallocate pages dynamically and proactively as needed.

 

至此   HugePages   已经配置完成。

 

虽然  Oracle  官方推荐使用  Huge Pages   但是具体是否使用还得考虑实际情况。   如果您的系统经常碰到因为   swap   引发的性能问题的系统可以考虑启用   HugePage   。另外,   OS   内存非常大的系统也可以启用   HugePage   。但是具体多大就一定需要使用   HugePage   ?这并没有定论。

 

参考文档:

 

HugePages on Oracle Linux 64-bit (  文档   ID361468.1)

 

HugePages and Oracle Database 11g AutomaticMemory Management (AMM) on Linux (  文档   ID 749851.1)

 

HugePages on Linux: What It Is... and WhatIt Is Not... (  文档   ID 361323.1)

 

Oracle Linux: Shell Script to CalculateValues Recommended Linux HugePages / HugeTLB Configuration (  文档   ID401749.1)

 

https://access.redhat.com/documentation/en-us/red_hat_enterprise_Linux/6/html/performance_tuning_guide/s-memory-transhuge#s-memory-configure_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

 

禁用透明大页  --Transparent Huge Pages (THP)

如果  HugePages_Total  返回     ,也意味着透明大页禁用了

grep -i HugePages_Total /proc/meminfo

若  cat /proc/sys/vm/nr_hugepages  返回     也意味着透明大页禁用了。

在以下命令中:

cat /sys/kernel/mm/transparent_hugepage/enabled

如果输出结果为  [always]  表示透明大页启用了。   [never]   表示透明大页禁用、   [madvise]   表示只在   MADV_HUGEPAGE   标志的   VMA   中使用   THP   。

 

编辑  /etc/default/grub  ,在   GRUB_CMDLINE_Linux   加入选项   transparent_hugepage=never

[root@rac18c-sharedisks ~]# 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 rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet   transparent_hugepage=never   "

GRUB_DISABLE_RECOVERY="true"

GRUB_CMDLINE_Linux_DEFAULT="console=ttyS0"

执行生效命令:

grub2-mkconfig -o /boot/grub2/grub.cfg

 

最后重启。

透明大页介绍

Transparent Huge Pages的一些官方介绍资料:

Transparent Huge Pages       (THP)   are enabled by default in RHEL 6 for all applications. The kernel attempts to allocate hugepages whenever possible and any Linux process will receive 2MB pages if the mmap region is 2MB naturally aligned. The main kernel address space itself is mapped with hugepages, reducing TLB pressure from kernel code. For general information on Hugepages, see: What are Huge Pages and what are the advantages of using them?

The kernel will always attempt to satisfy a memory allocation using hugepages. If no hugepages are available (due to non availability of physically continuous memory for example) the kernel will fall back to the regular 4KB pages. THP are also swappable (unlike hugetlbfs). This is achieved by breaking the huge page to smaller 4KB pages, which are then swapped out normally.

But to use hugepages effectively, the kernel must find physically continuous areas of memory big enough to satisfy the request, and also properly aligned. For this, a khugepaged kernel thread has been added. This thread will occasionally attempt to substitute smaller pages being used currently with a hugepage allocation, thus maximizing THP usage.

In userland, no modifications to the applications are necessary (hence transparent). But there are ways to optimize its use. For applications that want to use hugepages, use of posix_memalign() can also help ensure that large allocations are aligned to huge page (2MB) boundaries.

Also, THP is only enabled for anonymous memory regions. There are plans to add support for tmpfs and page cache. THP tunables are found in the /sys tree under /sys/kernel/mm/redhat_transparent_hugepage.

 

查看是否启用透明大页

1:命令cat /sys/kernel/mm/redhat_transparent_hugepage/enabled 该命令适用于Red Hat Enterprise linux系统

[root@getlnx06 ~]# more /etc/issue

 

 

 

Red Hat Enterprise Linux Server release 6.6 (Santiago)

 

 

 

Kernel \r on an \m

 

 

 

[root@getlnx06 ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

 

 

 

[always] madvise never

 

 

2:命令cat /sys/kernel/mm/transparent_hugepage/enabled 该命令适用于其它linux系统

[root@getlnx06 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled

 

 

 

always madvise [never]

 

 

 

[root@getlnx06 ~]#

 

使用命令查看时,如果输出结果为[always]表示透明大页启用了。[never]表示透明大页禁用、[madvise]表示  (只在MADV_HUGEPAGE标志的VMA中使用THP

 

3:如何HugePages_Total返回0,也意味着标准大页禁用了(注意传统/标准大页和透明大页的区别)

   透明大页(THP)管理和标准/传统大页(HP)管理都是操作系统为了减少页表转换消耗的资源而发布的新特性,虽然ORACLE建议利用大页机制来提高数据库的性能,但是ORACLE却同时建议关闭透明大页管理。这二者的区别在于大页的分配机制,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。

[root@getlnx06 ~]# grep -i HugePages_Total /proc/meminfo

 

 

 

HugePages_Total: 0

 

 

4:cat /proc/sys/vm/nr_hugepages返回0也意味着传统大页禁用了(传统大页和透明大页)。

[root@getlnx06 ~]# cat /proc/sys/vm/nr_hugepages

 

 

 

 

 

禁用、启用透明大页功能

 

方法1:设置/etc/grub.conf文件,在系统启动是禁用。

[root@getlnx06 ~]# vi /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,0)

 

#          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup--LogVol0-LogVol01

 

#          initrd /initrd-[generic-]version.img

 

#boot=/dev/sda

 

default=0

 

timeout=5

 

splashimage=(hd0,0)/grub/splash.xpm.gz

 

hiddenmenu

 

title Red Hat Enterprise Linux 6 (2.6.32-504.el6.x86_64)

 

        root (hd0,0)

 

        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/VolGroup--LogVol0-LogVol01 rd_NO_LUKS.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup-LogVol0/LogVol01 rd_LVM_LV=VolGroup-LogVol0/LogVol00  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

 

        initrd /initramfs-2.6.32-504.el6.x86_64.img

 

transparent_hugepage=never

 

Huge pages (标准大页)和 Transparent Huge pages(透明大页)

 

 

方法2:设置/etc/rc.local文件

[root@getlnx06 ~]# vi /etc/rc.local

 

#!/bin/sh

 

#

 

# This script will be executed *after* all the other init scripts.

 

# You can put your own initialization stuff in here if you don't

 

# want to do the full Sys V style init stuff.

 

 

 

touch /var/lock/subsys/local

 

 

 

if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then

 

   echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

 

fi

 

Huge pages (标准大页)和 Transparent Huge pages(透明大页)

 

 

使用上面的配置后必须重启操作系统才能生效,你也可以运行下面命令不用重启操作系统。

You must reboot your system for the setting to take effect, or run the following two echo lines to proceed with the install without rebooting:

[root@getlnx06 ~]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

 

[root@getlnx06 ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

 

always madvise [never]

 

[root@getlnx06 ~]#

 

 

小知识点:

1:从RedHat 6, OEL 6, SLES 11 and UEK2 kernels 开始,系统缺省会启用 Transparent HugePages :用来提高内存管理的性能透明大页(Transparent HugePages )和之前版本中的大页功能上类似。主要的区别是:Transparent HugePages 可以实时配置,不需要重启才能生效配置;

 

2:Transparent Huge Pages在32位的RHEL 6中是不支持的。

Transparent Huge Pages are not available on the 32-bit version of RHEL 6.

 

3: ORACLE官方不建议我们使用RedHat 6, OEL 6, SLES 11 and UEK2 kernels 时的开启透明大页(Transparent HugePages ), 因为透明大页(Transparent HugePages ) 存在一些问题:

        1.在RAC环境下 透明大页(Transparent HugePages )会导致异常节点重启,和性能问题;

        2.在单机环境中,透明大页(Transparent HugePages ) 也会导致一些异常的性能问题;

Transparent HugePages memory is enabled by default with Red Hat Enterprise Linux 6, SUSE Linux Enterprise Server 11, and Oracle Linux 6 with earlier releases of Oracle Linux Unbreakable Enterprise Kernel 2 (UEK2) kernels. Transparent HugePages memory is disabled in later releases of Oracle Linux UEK2 kernels.Transparent HugePages can cause memory allocation delays during runtime. To avoid performance issues, Oracle recommends that you disable Transparent HugePages on all Oracle Database servers. Oracle recommends that you instead use standard HugePages for enhanced performance.Transparent HugePages memory differs from standard HugePages memory because the kernel khugepaged thread allocates memory dynamically during runtime. Standard HugePages memory is pre-allocated at startup, and does not change during runtime.

Starting with RedHat 6, OEL 6, SLES 11 and UEK2 kernels, Transparent HugePages are implemented and enabled (default) in an attempt to improve the memory management. Transparent HugePages are similar to the HugePages that have been available in previous Linux releases. The main difference is that the Transparent HugePages are set up dynamically at run time by the khugepaged thread in kernel while the regular HugePages had to be preallocated at the boot up time. Because Transparent HugePages are known to cause unexpected node reboots and performance problems with RAC, Oracle strongly advises to disable the use of Transparent HugePages. In addition, Transparent Hugepages may cause problems even in a single-instance database environment with unexpected performance problems or delays. As such, Oracle recommends disabling Transparent HugePages on all Database servers running Oracle.

 

4:安装Vertica Analytic Database时也必须关闭透明大页功能。

 

参考资料:

https://access.redhat.com/solutions/46111

http://www.soso.io/article/65143.html

Linux7.4 关闭透明大页

Linux6.x之后的平台,在安装Oracle数据库的时候都建议关闭透明大页

Linux下的大页分为两种类型:标准大页(Huge Pages)和透明大页(Transparent Huge Pages)。

1). 标准大页(Huge Pages)是从Linux Kernel 2.6后被引入的。目的是使用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。
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

Linux7 默认情况下 是开启透明大页功能的。

检查系统对应版本 

[root@db-server ~]# uname -r

3.10.0-693.el7.x86_64

[root@db-server ~]# uname -a

Linux db-server 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

[root@db-server ~]# cat /etc/redhat-release 

CentOS Linux release 7.4.1708 (Core)

默认情况下,状态为always,需要调整为never

 

Huge pages (标准大页)和 Transparent Huge pages(透明大页)

修改文件 /etc/default/grub 文件

Huge pages (标准大页)和 Transparent Huge pages(透明大页)

执行生效命令 grub2-mkconfig -o /boot/grub2/grub.cfg

Huge pages (标准大页)和 Transparent Huge pages(透明大页)

重启 

reboot

检查是否生效

如果你也是grub2的linux系统,请通过以下步骤关闭大内存页面。

step1 编辑 /etc/default/grub,在GRUB_CMDLINE_Linux加入选项 transparent_hugepage=never

1234567GRUB_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="rd.lvm.lv=fedora/swap rd.lvm.lv=fedora/root rhgb quiet transparent_hugepage=never"        GRUB_DISABLE_RECOVERY="true"        

step2 重新生成grub配置文件

1234On BIOS-based machines, issue the following           command           as root:        # grub2-mkconfig -o /boot/grub2/grub.cfg        On UEFI-based machines, issue the following           command           as root:        # grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg        

step3 重启你的系统

至此大功告成,如果你使用的是grub,请把选项写入grub.conf文件就好了。

查询hugepage状态,第一种方式

1234[root@localhost yucanlin]          # cat /sys/kernel/mm/transparent_hugepage/enabled        always madvise [never]        [root@localhost yucanlin]          # cat /sys/kernel/mm/transparent_hugepage/defrag        always madvise [never]        

never就对了。

第二种方式

1234567[yucanlin@localhost ~]$           grep           Huge          /proc/meminfo        AnonHugePages:         0 kB        HugePages_Total:       0        HugePages_Free:        0        HugePages_Rsvd:        0        HugePages_Surp:        0        Hugepagesize:       2048 kB        

0就对了。

不过有个小遗憾,重启后我发现 enabled 是never,但defrag却依然是always,不过经过查询meminfo,大内存页面是被禁用了。就不去管他了。

0

精彩评论

暂无评论...
验证码 换一张
取 消