转自: https://www.codenong.com/cs105331500/
---在 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),因为透明巨页存在一些问题:
- 在 RAC 环境下,透明巨页(THP)会导致异常节点重启和性能问题;
- 在单机环境中,透明巨页(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 默认情况下 是开启透明巨页功能的。检查系统对应版本
1 | [root@DB ~]# cat /etc/redhat-release |
关闭THP
1 | [root@DB ~]# cat /sys/kernel/mm/transparent_hugepage/enabled |
默认情况下,状态为 always,需要调整为 never
THP 禁用方的几种方法
方法 1:
1 | [root@DB ~]# vi /etc/default/grub |
运行下列命令使之修改生效:
1 | [root@DB ~]# grub2-mkconfig -o /boot/grub2/grub.cfg |
方法 2:上面的方法重启之后好像并没生效,可用以下方法:
1 | [root@DB ~]#vi /etc/rc.local |
1 | [root@DB ~]# cat /sys/kernel/mm/transparent_hugepage/enabled |
方法 3:
1 | [root@DB ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled |
查看是否关闭透明巨页
1 | [root@DB ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled |
如果输出结果为[always]表示透明巨页启用了。[never]表示透明巨页禁用;
1 | [root@DB ~]# grep -i HugePages_Total /proc/meminfo |
如果 HugePages_Total,返回 0,也意味着透明巨页禁用了
1 | [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 强烈建议禁用透明超大页面。即使在单实例数据库环境中,也会出现意外的性能问题或延迟
---另外一篇介绍大页和透明的文章也不错 <<Linux透明大页机制在云上大规模集群实践介绍>>
转自:https://baijiahao.baidu.com/s?id=1738942131058299073&wfr=spider&for=pc
文章总结:
2.1 标准大页(HugePage)
缺点:
需要合理设置,避免内存浪费:在操作系统启动期间被动态分配并被保留,共享内存不会被置换,在使用HugePage的内存不能被其他的进程使用,所以要合理设置该值,避免造成内存浪费。
静态设置无法自适应:如果增加HugePage或添加物理内存或者是当前服务器增加了新的实例发生变化,需要重新设置所需的HugePage大小
3)大页使用
应用需要通过mmap系统调用或者shmat和shmget系统调用适配才可以使用大页,一般的应用进程都是不可以访问此大页空间。
2.2 透明大页(Transparent Huge Pages)
标准大页可带来性能提升,但存在配置和管理上的困难,很难手动管理,而且通常需要对代码进行重大的更改才能有效使用,不能通用适配应用的接入使用,从RHEL 6 开始引入透明大页技术(kernel >=kernel-2.6.32),在标准大页的基础上,通过一个抽象层,能够自动创建、管理和使用传统大页,用来提高内存管理的性能,解决大页手动管理的问题,透明大页为系统管理员和开发人员减少了很多使用传统大页的复杂性。
优点:
相对标准大页,操作系统动态管理大页分配,支持大页分配 ,大页->普通页换出拆分,根据具体应用使用情况,自适应调整分配。
使用上对应用透明,且开源社区持续测试、优化和适配大部分应用,同时支持多种大页申请方式配置,满足多场景的分配需求
缺点:
THP在运行时动态分配内存,可能会带来运行时内存分配的CPU开销和上涨问题。
THP同步申请模式下,分配失败时触发申请时,导致应用的一些随机卡顿现象。




