如何检查和禁用透明大页面(CentOS/RHEL 7)

时间:2020-01-09 10:38:12  来源:igfitidea点击:

数据库优化的另一个重要部分是透明HugePages。

因此,在本文中,我将与运行时示例共享禁用透明大页面的步骤,并永久禁用它们(永久重启)。

大页面是指默认大小为2 MB或者更大的页面。
红帽使用两种不同的大页面大小,默认值为" 2 MB",并且可以选择使用更大的大页面以及" 1 GB"大小。

为什么要使用大页面?

  • 原因之一可能是庞大的页面有助于优化TLB。

  • TLB代表" T"翻译" L" ookasideBuffer。

  • TLB是一种内存缓存,用于减少访问用户内存位置所花费的时间。

  • 保留此缓冲区是为了将有关巨大内存页面的信息保存到缓存中

  • 该缓冲区不是很大,它需要宝贵的内存,因此我们希望它尽可能地高效。

  • 这就是为什么如果我们想使用大页面来优化TLB的使用可能是一个选择。

如何监视透明大页面?

通过阅读/proc/meminfo中的AnonHugePages字段,可以获得系统当前使用的匿名透明大页面的数量。

# grep -i AnonHugePages /proc/meminfo
AnonHugePages: 1216512 kB

为了确定哪些应用程序正在使用匿名透明大页面,必须读取/proc/PID/smaps并计算每个映射的AnonHugePages字段。

# grep -e AnonHugePages /proc/$(pgrep test.sh)/smaps | awk '{ if(>0) print 
# grep -i huge /proc/meminfo
AnonHugePages:     10240 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
} ' AnonHugePages: 120832 kB

注意:/proc/vmstat中有许多计数器可以用来监视系统提供巨大页面供使用的成功程度。

如何分配HugePages?

我们可以使用sysctl -w从命令行在运行时分配大页面。
现在,在进行预订之前,让我们验证我们的大页预订

# free -m
              total        used        free      shared  buff/cache   available
Mem:           3790         194        3318          46         277        3314
Swap:           759           0         759

因此,对于大页面没有保留,以下是可用和已用内存的详细信息

# sysctl -w vm.nr_hugepages=512
vm.nr_hugepages = 512

重要说明:仅当连续内存可用时,此方法才有效,因此我们可能必须在启动计算机时立即执行此操作,因为否则可能会冒连续内存不足的风险。

让我们为大型页面保留512MB的空间

# free -m
              total        used        free      shared  buff/cache   available
Mem:           3790        1220        2292          46         277        2289
Swap:           759           0         759

如果我们立即观察到我们内存中以前空闲的部分,现在将不再可用,它们将保留用于大页面

# grep -i huge /proc/meminfo
AnonHugePages:     14336 kB
HugePages_Total:     512
HugePages_Free:      512
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

再次验证超大页面预订

# cat /etc/sysctl.d/10-hugepages.conf
vm.nr_hugepages=512

要使更改永久生效,请将这些值添加到sysctl中。
我将在/etc/sysctl.d/下创建一个新文件10-hugepages.conf。

# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

重要说明:使用大页面时,我们应该始终注意到大页面不再可用作常规内存,因此,如果将其用于大页面,则无法将其用于其他任何用途。

如何在运行时禁用透明大页面(AnonHugePages)?

要为当前会话禁用透明大页面,请执行以下命令。
这将仅停止创建和使用新的THP。

# echo never > /sys/kernel/mm/transparent_hugepage/enabled

或者(取决于发行版)

GRUB_CMDLINE_LINUX="novga console=ttyS0,115200 panic=1 numa=off elevator=cfq rd.md.uuid=d265dd3d:9ee4d53a:597b8c08:8201b9af rd.lvm.lv=os/root rd.md.uuid=5398452a:ab1b8e91:4307b53b:5c3cccbd rd.md.uuid=131bc1e7:7c9087c3:03f3ad4a:7cde170c noht rhgb quiet transparent_hugepage=never"

接下来,我们可以验证透明大页面(AnonHugePages)的状态。

如何永久禁用透明HugePages(AnonHugePages)?

要永久禁用透明的HugePages(AnonHugePages),如下所示,将transparent_hugepage = never添加到内核命令行:

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

接下来重建GRUB2配置文件

提示:

以下命令适用于基于UEFI的计算机上的旧版BIOS:~]#grub2-mkconfig -o/boot/efi/EFI/redhat/grub.cfg

# shutdown -r now

重新引导节点以使更改生效。

# grep transparent_hugepage /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-862.6.3.el7.x86_64 root=/dev/mapper/os-root ro novga console=ttyS0,115200 panic=1 numa=off elevator=cfq rd.md.uuid=d265dd3d:9ee4d53a:597b8c08:8201b9af rd.lvm.lv=os/root rd.md.uuid=5398452a:ab1b8e91:4307b53b:5c3cccbd rd.md.uuid=131bc1e7:7c9087c3:03f3ad4a:7cde170c noht biosdevname=0 net.ifnames=0 rhgb quiet transparent_hugepage=never

节点启动后,请确保新添加的条目存在于已加载的grub配置中

# echo 0 > /proc/sys/vm/nr_hugepages

因此,配置已正确加载。

接下来,我们可以验证透明大页面(AnonHugePages)的状态

如何在运行时禁用显式透明大页面(nr_hugepages)?

nr_hugepages指示内核的大页面池中"持久"大页面的当前数量。
当任务释放时,"持久"大页面将返回到大页面池。
具有root特权的用户可以通过增大或者减小nr_hugepages的值来动态分配更多或者释放一些持久的大页面。

当支持多个大页面时,/proc/sys/vm/nr_hugepages表示当前已预先分配的默认大小的大页面数。

因此,可以使用以下命令动态分配/取消分配默认大小的持久性大页面。
如果/proc/sys/vm/nr_hugepages文件或者sysctl.conf中的vm.nr_hugepages的值为0,则表示系统上的HugePages已禁用

要为当前会话禁用显式的透明大页面,请执行以下命令:

# cat /proc/sys/vm/nr_hugepages
0
# sysctl vm.nr_hugepages
vm.nr_hugepages = 0
# cat /etc/sysctl.d/disable_hugepage.conf
vm.nr_hugepages=0

接下来,我们可以验证系统上显式透明大页面(nr_hugepages)的状态。

如何使用sysctl永久禁用显式透明大页面(nr_hugepages)?

现在,让我指导我们永久禁用显式透明大页面的步骤。
我将创建一个新的sysctl文件并添加vm.nr_hugepages = 0

# lsinitrd /boot/initramfs-`uname -r`.img | grep hugepage

现在,在刷新dracut条目之前,让我们验证initramfs的内容,以确保它没有来自sysctl的大页面条目。

# dracut -f

现在让我们刷新我们的快捷条目

# lsinitrd /boot/initramfs-`uname -r`.img | grep hugepage
-rw-r----- 1 root root 18 May 31 18:46 etc/sysctl.d/disable_hugepage.conf

现在重新验证initramfs的内容。
如我们所见,我们现在提供了新的sysctl内容。

# cat /sys/devices/system/node/node*/meminfo | fgrep Huge
Node 0 AnonHugePages: 0 kB
Node 0 HugePages_Total: 0
Node 0 HugePages_Free: 0
Node 0 HugePages_Surp: 0

验证显式透明大页面的状态

##代码##

接下来,我们可以验证系统上显式透明大页面(nr_hugepages)的状态。

提示:

需要重新引导以完全释放保留的内存,这可以在保留或者清除内存的初始引导阶段完成。