禁用透明大页 (THP)
透明大页 (THP) 是一种 Linux 内存管理系统。在具有大量内存的计算机上,该系统可以利用较大的内存页面来减少查找转换后备缓冲区 (TLB) 的开销。
然而,在启用 THP 的情况下,数据库工作负载通常性能较差,因为它们往往具有稀疏而不是连续的内存访问模式。在 Linux 上运行 MongoDB 时,应禁用 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 保持禁用状态。