为自管理部署禁用透明大页面 (THP)
重要
已升级MongoDB 8.0中的 TCMalloc
从MongoDB 8.0开始, MongoDB使用 TCMalloc 的升级版本,可通过启用透明大页来提高性能。 如果您使用的是MongoDB 8.0或更高版本,请参阅启用透明大页面 (THP)。
透明大页 (THP) 是一种Linux内存管理系统,可减少转换后备缓冲区 (TLB) 查找的开销。 THP 通过组合小页面并使其在应用程序中显示为较大的内存页面来实现此目的。
在Linux上运行MongoDB 7.0或更早版本时,应禁用 THP 以获得最佳性能。 在MongoDB的早期版本中,启用 THP 后,数据库工作负载的性能通常会下降,因为它们经常使用非连续的内存访问权限模式。
注意
您可以在系统级别启用THP,并在进程级别禁用 THP。 如果一台计算机上有多个MongoDB进程,请确保8.0版本上的进程启用THP,而7.0或更早版本上的进程禁用 THP。
要确保在 mongod
启动之前禁用 THP,请为操作系统创建一个服务文件,用于在启动时禁用 THP。 以下说明包括systemd和System V init初始化系统的示例。
此外,对于使用ktune
和tuned
性能配置文件的 RHEL和CentOS系统,您还必须创建自定义tuned
配置文件。
创建服务文件
要创建禁用 THP 的服务文件,请使用操作系统的内置初始化系统。 最新版本的Linux通常使用systemd ,而后者使用systemctl
命令。 旧版本的Linux使用System V init ,而后者会使用service
命令。 有关更多信息,请参阅操作系统的文档。
使用适合您操作系统的初始化系统:
创建systemd
单元文件
创建以下文件并将其保存在 /etc/systemd/system/disable-transparent-huge-pages.service
中:
[Unit] Description=Disable Transparent Hugepages (THP) DefaultDependencies=no After=sysinit.target local-fs.target Before=mongod.service [Service] Type=oneshot ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null' [Install] WantedBy=basic.target
注意
某些版本的 Red Hat Enterprise Linux(可能还包括基于 Red Hat 的其他衍生产品)对 THP enabled
文件使用不同的路径:
/sys/kernel/mm/redhat_transparent_hugepage/enabled
验证您的系统正在使用哪个路径,并相应地更新 disable-transparent-huge-pages.service
文件。
启动服务
运行:
sudo systemctl start disable-transparent-huge-pages
要验证相关的 THP 设置是否已更改,请运行以下命令:
cat /sys/kernel/mm/transparent_hugepage/disabled && cat /sys/kernel/mm/transparent_hugepage/defrag
在 Red Hat Enterprise Linux(可能还包括基于 Red Hat 的其他衍生产品)上,可能需要使用如下命令:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled && cat /sys/kernel/mm/redhat_transparent_hugepage/defrag
输出应如下所示:
never never
创建init.d
脚本
创建以下文件并将其保存在 /etc/init.d/disable-transparent-hugepages
中:
!/bin/bash ## BEGIN INIT INFO Provides: disable-transparent-hugepages Required-Start: $local_fs Required-Stop: X-Start-Before: mongod mongodb-mms-automation-agent Default-Start: 2 3 4 5 Default-Stop: 0 1 6 Short-Description: Disable Linux Transparent Hugepages Description: Disable Linux Transparent Hugepages, to improve database performance. ## END INIT INFO case $1 in start) if [ -d /sys/kernel/mm/transparent_hugepage ]; then thp_path=/sys/kernel/mm/transparent_hugepage elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then thp_path=/sys/kernel/mm/redhat_transparent_hugepage else return 0 fi echo 'never' | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo 'never' | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null unset thp_path ;; esac
运行脚本
运行:
sudo /etc/init.d/disable-transparent-hugepages start
要验证相关的 THP 设置是否已更改,请运行以下命令:
cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag
在 Red Hat Enterprise Linux(可能还包括基于 Red Hat 的其他衍生产品)上,可能需要使用如下命令:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled && cat /sys/kernel/mm/redhat_transparent_hugepage/defrag
输出应如下所示:
never never
使用tuned
和ktune
重要
如果使用tuned
或ktune
,请在创建服务文件后执行本节中的步骤。
tuned
和ktune
是内核调优实用程序,可以影响系统上的透明大页设置。 如果您在运行mongod
时在RHEL或CentOS系统上使用tuned
或ktune
,则必须创建自定义tuned
配置文件以确保 THP 保持禁用状态。