阅读目录

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 。


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


标准大页的页面大小


[root@localhost ~]# grep Hugepagesize /proc/meminfo

Hugepagesize: 2048 kB


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

​回到顶部​

使用Huge pages优点

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  也会存在某些缺点:

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

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

​回到顶部​

Transparent Huge pages存在的问题

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


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


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


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


​回到顶部​

如何关闭 Transparent Huge pages ?

环境:CentOS Linux release 7.8.2003 (Core)

[root@localhost ~]# grep Huge /proc/meminfo

AnonHugePages: 7956480 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB

检查当前的transparent_hugepage状态(以下为开启状态)


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


透明大页关闭方法有两种,一种是通过命令关闭,一种通过修改grub开机引导文件关闭:

方法一

1)手动临时关闭

[root@localhost ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@localhost ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag


2)开机自动关闭

​[root@localhost ~]# vim /etc/rc.d/rc.local​

LInux 标准大页和透明大页_oracle

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

LInux 标准大页和透明大页_oracle

​授予执行权限​

[root@localhost ~]# chmod +x /etc/rc.d/rc.local

方法二

编辑/etc/sysconfig/grub 文件,在 GRUB_CMDLINE_LINUX 那一行后面追加 transparent_hugepage=never例如:

[root@localhost ~]# cat /etc/sysconfig/grub

LInux 标准大页和透明大页_oracle

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 spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rd.lvm.lv=centos/usr rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"

LInux 标准大页和透明大页_oracle


再使用 grub2-mkconfig 生成grub.cfg配置文件。

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


最后重启系统使配置生效。