note-taker:Ethan_Yang
recording time: 2019/07/24
number of docs:8
【前言】
在Oracle安装之前的准备工作中,有一项必须的工作是:禁用透明巨页(Disabling Transparent HugePages)。
那问题来了:
为什么要关闭透明大页? 以及怎么进行禁用?
先来看下比较权威的介绍:
https://blogs.oracle.com/linux/performance-issues-with-transparent-huge-pages-thp
划重点:
根据上述文中标红处,简单来说就是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 默认情况下 是开启透明巨页功能的。检查系统对应版本
[root@ethanDB ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)
Disabling Transparent HugePages
[root@ethanDB ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
默认情况下,状态为always,需要调整为never
THP禁用方的几种方法
方法1:
[root@ethanDB ~]# vi /etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap rd.lvm.lv=rhel/root rhgb quiet transparent_hugepage=never"
[root@ethanDB ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
方法2:
上面的方法重启之后好像并没生效,可用以下方法:
或:Add the following lines in /etc/rc.local and reboot the server:
[root@ethanDB ~]#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@ethanDB ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
方法3:
[root@ethanDB ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@ethanDB ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
always madvise [never]
查看是否关闭透明巨页
[root@ethanDB ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
always madvise [never]
如果输出结果为[always]表示透明巨页启用了。[never]表示透明巨页禁用;
[root@ethanDB ~]# grep -i HugePages_Total /proc/meminfo
如果HugePages_Total,返回0,也意味着透明巨页禁用了
[root@ethanDB ~]# cat /proc/sys/vm/nr_hugepages
返回0也意味着透明巨页禁用了。
【结语】
本文讲述了Oracle 禁Transparent HugePages的原因和方法;
从RedHat 6,OEL 6,SLES 11和UEK2内核开始,系统缺省会启用 Transparent HugePages,用来提高内存管理的性能透明巨页(Transparent HugePages )和之前版本中的大页功能上类似。主要的区别是:Transparent HugePages 可以实时配置,不需要重启才能生效配置;
透明HugePages类似于以前Linux版本中可用的HugePages。主要区别在于透明HugePages是在运行时由内核中的khugepaged线程动态设置,常规的HugePages必须在启动时预先分配。
透明超大页面已知会导致意外的节点重新启动并导致RAC出现性能问题,因此Oracle强烈建议禁用透明超大页面。即使在单实例数据库环境中,也会出现意外的性能问题或延迟。
【参考】
https://www.2cto.com/database/201804/735762.html
【参考】
https://access.redhat.com/solutions/422283
【参考】
https://blogs.oracle.com/linux/performance-issues-with-transparent-huge-pages-thp
【参考】
https://blog.51cto.com/8026776/2074544
如果大家觉得此文有帮助,欢迎关注个人微信公众号;
长按识别二维码或公众号搜索“一森咖记”