ORACLE RAC关闭透明大页的原因及方法

在 Oracle 安装之前的准备工作中,有一项必须的工作是:禁用透明巨页(Disabling Transparent HugePages)。
那问题来了:为什么要关闭透明大页? 以及怎么进行禁用?

简单来说就是 Oracle Linux team 在测试的过程中发现,如果 linux 开启透明巨页THP,则 I/O 读写性能降低 30%;如果关闭透明巨页 THP,I/O 读写性能则恢复正常。另,建议在 Oracle Database 中不要使用 THP。

接下来说一下透明巨大页面是什么?
Linux 下的大页分为两种类型:标准大页(Huge Pages)和透明巨页(Transparent Huge Pages)。
(1)标准大页(Huge Pages)是从 Linux Kernel 2.6 后被引入的。目的是用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。
(2)透明巨页(Transparent Huge Pages)缩写为 THP,透明超大页面(THP)在 RHEL 6 中默认情况下对所有应用程序都是启用的。内核试图尽可能分配巨大的页面,主内核地址空间本身被映射为巨大的页面,减少了内核代码的 TLB 压力。内核将始终尝试使用巨页来满足内存分配。如果没有可用的巨大页面(例如由于物理连续内存不可用),内核将回退到正常的 4KB 页面。THP 也是可交换的(不像 hugetlbfs)。这是通过将大页面分成更小的 4KB 页面来实现的,然后这些页面被正常地换出。

两者区别在于大页的分配机制,标准大页管理是预分配方式,而透明巨页管理则是动态分配方式。目前透明巨页与传统大页混合使用会出现一些问题,导致性能问题和系统重启。ORACLE 官方不建议在使用 RedHat 6, OEL 6, SLES 11 and UEK2 kernels 时开启透明巨页(THP),因为透明巨页存在一些问题:

  1. 在 RAC 环境下,透明巨页(THP)会导致异常节点重启和性能问题;
  2. 在单机环境中,透明巨页(THP)也会导致一些异常的性能问题;

在 Linux6.x 之后的平台,在安装 Oracle 时都建议关闭透明巨页。

默认情况下,Red Hat Enterprise Linux 6,SUSE Linux Enterprise Server 11 和 Oracle Linux 6 与早期版本的 Oracle Linux Unbreakable Enterprise Kernel 2(UEK2)内核一起启用透明 HugePages 内存。在 Oracle Linux UEK2 内核的更高版本中禁用透明 HugePages 内存,Transparent HugePages 可能导致运行时内存分配延迟。

为避免性能问题,Oracle 建议您在所有 Oracle 数据库服务器上禁用透明超大页面。Oracle 建议您使用标准的 HugePages 来提高性能.Transparent HugePages 内存与标准 HugePages 内存不同,因为内核khugepaged 线程在运行时动态分配内存。标准 HugePages 内存在启动时预先分配,并且在运行时不会更改。

问题:如何关闭透明巨页(THP)?

Linux7 默认情况下 是开启透明巨页功能的。检查系统对应版本

[root@DB ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)

关闭THP

[root@DB ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

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

THP 禁用方的几种方法
方法 1:

[root@DB ~]# vi /etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap rd.lvm.lv=rhel/root rhgb quiet transparent_hugepage=never"

运行下列命令使之修改生效:

[root@DB ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

方法 2:上面的方法重启之后好像并没生效,可用以下方法:

[root@DB ~]#vi /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
[root@DB ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

方法 3:

[root@DB ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@DB ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
always madvise [never]

查看是否关闭透明巨页

[root@DB ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
always madvise [never]

如果输出结果为[always]表示透明巨页启用了。[never]表示透明巨页禁用;

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

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

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

返回 0 也意味着透明巨页禁用了。

【结语】
1 . 本文讲述了 Oracle 禁 Transparent HugePages 的原因和方法

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

3 . 透明 HugePages 类似于以前 Linux 版本中可用的 HugePages。主要区别在于透明 HugePages 是在运行时由内核中的 khugepaged 线程动态设置,常规的 HugePages 必须在启动时预先分配

4 . 透明超大页面已知会导致意外的节点重新启动并导致 RAC 出现性能问题,因此 Oracle 强烈建议禁用透明超大页面。即使在单实例数据库环境中,也会出现意外的性能问题或延迟

发布了68 篇原创文章 · 获赞 103 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41944882/article/details/105331500
今日推荐