为自管理部署禁用透明大页面 (THP)
重要
MongoDB 8.0 中升级了 TCMalloc
从 MongoDB 8.0 版本开始,MongoDB 使用了升级版的 TCMalloc,在启用透明大页面(THP)的情况下提高了性能。如果您正在使用 MongoDB 8.0 或更高版本,请参阅启用透明大页面(THP).
透明大页面(THP)是 Linux 内存管理系统,它可以减少转换后备缓冲区(TLB)查找的开销。THP 通过合并小型页面,使它们对应用程序看起来像更大的内存页面来实现这一点。
在 Linux 上运行 MongoDB 7.0 或更早版本时,应禁用 THP 以获得最佳性能。在 MongoDB 的早期版本中,数据库工作负载通常在启用 THP 的情况下会降低性能,因为它们通常使用非连续的内存访问模式。
注意
您可以在系统级别启用 THP 并在进程级别禁用它。如果您在一台机器上运行多个 MongoDB 进程,请确保 8.0 版本的进程启用 THP,而 7.0 或更早版本的进程禁用 THP。
为确保在 mongod
启动之前禁用 THP,为您的操作系统创建一个服务文件以在启动时禁用 THP。以下指令包括针对 systemd 和 System V init 初始化系统的示例。
此外,对于RHEL 和 CentOS 系统,这些系统使用 ktune
和 tuned
性能配置文件,您还必须创建一个自定义的 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 启用
文件
/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/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
创建 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
的同时使用tuned
或ktune
在您的RHEL或CentOS系统上,您必须创建一个自定义的tuned
配置文件,以确保THP保持禁用状态。