本文简单介绍了大页内存;
大页内存简介
(传统)大页内存
什么是大页内存
大页内存(HugePages),有时也叫“大内存页”、“内存大页”、“标准大页”。操作系统以内存页为单位管理内存,内存页的大小对系统性能有影响:
内存页设得太小,内存页会很多,管理内存页的数组会比较大,耗内存,同时TLB(Translation Lookaside Buffer,页表寄存缓冲器,可理解为页表缓冲)大小是固定的,导致TLB MISS增加。在不同的应用场合,内存页的大小的最优值是不同的。所以一般的系统都支持多种内存页的取值。
大页内存的优势
综上所述,“大内存页”有助于 Linux 系统进行虚拟内存管理。顾名思义,除了标准的4KB大小的页面外,它还能帮助管理内存中的巨大的页面(通常是2MB),使用“大内存页”,你最大可以定义 1GB 的页面大小。
对于那些内存操作非常频繁的业务来说,可以有效的提高性能。简而言之,通过启用大页内存,系统只需要处理较少的页面映射表,从而减少访问/维护它们的开销!
大页内存使用:hugetlbfs
(传统)大页内存需要在系统中提前预留巨页,用户必须显式地通过hugetlbfs文件系统实现的mmap底层接口或者通过libhugetlbfs.so的库指定使用巨页!
见:https://blog.csdn.net/weixin_48101150/article/details/117824214
大页内存原理
大页内存类似专用内存,会从系统中抠出一块大内存,而想要使用这块内存,应用程序必须修改程序。
其次,如果程序内存使用较少,却申请了大页,就造成了内存浪费。
此时,可以使用透明大页(Transparent Huge Pages,THP);
详见:
透明大页(Transparent Huge Pages,THP)
什么是透明大页
除了上面的标准大页以外,实际上Linux 下的大页分为两种类型:
- 标准大页(Huge Pages)
- 透明巨页(Transparent Huge Pages)
标准大页(Huge Pages):是从 Linux Kernel 2.6 后被引入的。目的是用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。
透明大页(Transparent Huge Pages):缩写为 THP,透明超大页面(THP)在 RHEL 6 中默认情况下对所有应用程序都是启用的。内核试图尽可能分配巨大的页面,主内核地址空间本身被映射为巨大的页面,减少了内核代码的 TLB 压力。内核将始终尝试使用巨页来满足内存分配。如果没有可用的巨大页面(例如由于物理连续内存不可用),内核将回退到正常的 4KB 页面。THP 也是可交换的(不像 hugetlbfs)。这是通过将大页面分成更小的 4KB 页面来实现的,然后这些页面被正常地换出。
两者区别在于:
大页的分配机制,标准大页管理是预分配方式,而透明巨页管理则是动态分配方式,且不需要修改程序源码。
关闭透明大页的原因
参考自:https://blog.csdn.net/qq_20408423/article/details/121606540
在 Oracle 安装之前的准备工作中,有一项必须的工作是:禁用透明巨页(Disabling Transparent HugePages)。
这是由于,目前透明巨页与传统大页混合使用会出现一些问题,导致性能问题和系统重启。因此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 内存在启动时预先分配,并且在运行时不会更改。
使用透明巨页
查看透明巨页开启状态
Linux 7 默认情况下是开启透明巨页功能的,可以检查是否开启:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
默认情况下,状态为always;
三种模式区别:
- never,禁止使用透明巨页;
- always,总是使用透明巨页;
- madvise,通过madvise使用透明巨页;
如果启动”always”,那就是系统默认进行在分配巨页的时候,所需要的内存大于2MiB,将会默认分配巨页!
强调一下:
分配的内存并不一定都是巨页,巨页是按照某个配置项设置的”伪对齐”,比如:虚拟机默认2MiB对齐(pmd中间页表项),通过malloc分配3MiB,其中2MiB是巨页,剩下的1MiB就是buddy的普通页;
关闭透明巨页
可以将上面的 always 修改为 never 来关闭透明巨页;
临时关闭
临时关闭透明巨页:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
永久关闭
如果想要永久关闭:
以 root 用户身份编辑 /etc/default/grub
文件,在 GRUB_CMDLINE_LINUX_DEFAULT
变量后添加以下 GRUB 启动参数:
transparent_hugepage=never
例如:
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 resume=/dev/mapper/bigcloud--enterprise--linux--for--euler-swap rd.lvm.lv=bigcloud-enterprise-linux-for-euler/root rd.lvm.lv=bigcloud-enterprise-linux-for-euler/swap crashkernel=512M transparent_hugepage=never"
更新 grub 配置:
grub2-mkconfig -o /boot/grub2/grub.cfg
最后,重启系统以使配置生效。
注意:修改完之后,需要重启主机才能生效!
重启后,通过以下命令可以查看是否成功关闭:
cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
其他命令
查看大页内存方法:
#查看大页内存使用情况
grep Huge /proc/meminfo
#查看各个numa节点的大页内存情况
cat /sys/devices/system/node/node*/meminfo | fgrep Huge
#查看大页内存挂载情况
cat /proc/mounts
附录
文章参考
- https://www.cnblogs.com/linhaostudy/p/16931513.html
- https://blog.csdn.net/qq_20408423/article/details/121606540
- https://zhuanlan.zhihu.com/p/542132384