禁用透明大页 (THP)

透明大页(Transparent Huge Pages,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命令)。有关详细信息,请参阅适用于您的操作系统的文档。

使用适合您平台的初始化系统:

系统(systemctl)

  1. 创建systemd单元文件

    在以下位置创建以下文件/etc/systemd/system/disable-transparent-huge-pages.service

    [Unit]
    Description=Disable Transparent Huge Pages (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'
    
    [Install]
    WantedBy=basic.target
    

    笔记:

    红帽企业 Linux的某些版本以及可能的其他基于 Red Hat 的衍生版本对 THP 文件使用不同的路径enabled

    /sys/kernel/mm/redhat_transparent_hugepage/enabled
    

    检查系统上正在使用哪个路径,并disable-transparent-huge-pages.service相应地更新文件。

    笔记:

    在版本 4.2 之前,MongoDB 还会检查 THP defrag 设置,并在启用 defrag 时显示启动警告。只要 THP 本身在systemd单元文件中被禁用,MongoDB 就不会受到碎片整理设置的影响。但是,为了避免出现此消息,您可以通过在单元文件中现有语句之后never添加以下附加行来 设置 defrag :systemd``ExecStart

    ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'
    

    如果在 Red Hat 或类似系统上,文件的路径defrag可能会有所不同。有关更多详细信息,请参阅上面的注释,并disable-transparent-huge-pages.service相应地更新文件。

  2. 重新加载systemd单元文件

    运行以下命令重新加载systemd单元文件以供 disable-transparent-huge-pages.service使用:

    sudo systemctl daemon-reload
    
  3. 启动服务

    手动启动服务一次,以确保适当的 THP 设置已更改:

    sudo systemctl start disable-transparent-huge-pages
    

    [never]通过运行以下命令验证 THP 是否已成功设置:

    cat /sys/kernel/mm/transparent_hugepage/enabled
    

    在红帽企业 Linux和可能的其他基于 Red Hat 的衍生产品上,您可能需要使用以下命令:

    cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
    
  4. 配置您的操作系统以在启动时运行它

    sudo systemctl enable disable-transparent-huge-pages
    
  5. 自定义tuned / ktune 配置文件(如果适用)。

    如果您正在使用RHEL tuned/ CentOS,则现在还必须创建自定义配置文件。ktune``tuned

System V init(service)

  1. 创建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 huge pages
    # Description:       Disable Linux transparent huge pages, 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 ${thp_path}/enabled > /dev/null
    
        unset thp_path
        ;;
    esac
    

    笔记

    在版本 4.2 之前,MongoDB 还会检查 THP defrag 设置,并在启用 defrag 时显示启动警告。只要在init.d脚本中禁用 THP 本身,MongoDB 就不会受到碎片整理设置的影响。 但是,为了避免出现此消息,您可以通过在脚本中的语句之前never添加以下行来设置碎片整理 :init.d``unset thp_path

    echo 'never' | tee ${thp_path}/defrag > /dev/null
    
  2. 使其可执行

    运行以下命令使脚本可执行:

    sudo chmod 755 /etc/init.d/disable-transparent-hugepages
    
  3. 运行脚本

    手动运行一次脚本以确保适当的 THP 设置已更改:

    sudo /etc/init.d/disable-transparent-hugepages start
    

    [never]通过运行以下命令验证 THP 是否已成功设置:

    cat /sys/kernel/mm/transparent_hugepage/enabled
    

    在 Red Hat Enterprise Linux 和可能的其他基于 Red Hat 的衍生产品上,您可能需要使用以下命令:

    cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
    
  4. 配置您的操作系统以在启动时运行它

    要确保每次系统启动时都应用此设置,请针对您的 Linux 发行版运行以下命令:

    | 分配 | 命令 | | :----------------------------------------- | :-------------------------------------------------------- | | Ubuntu 和 Debian | sudo update-rc.d disable-transparent-hugepages defaults | | SUSE | sudo insserv /etc/init.d/disable-transparent-hugepages | | Red Hat、CentOS、Amazon Linux 及其衍生产品 | sudo chkconfig --add disable-transparent-hugepages |

  5. 自定义tuned / ktune 配置文件(如果适用)

    如果您正在使用RHEL tuned/ CentOS,则现在还必须创建自定义配置文件。ktune``tuned

使用tunedktune

重要的

如果使用tunedktune,您还必须在创建上述服务文件后执行本节中的步骤。

tunedktune是动态内核调整工具,可以影响系统上的透明大页面设置。如果您在运行时在RHEL /CentOS 系统上使用 tuned/ ,则必须创建自定义 配置文件以确保 THP 保持禁用状态。ktune``mongod``tuned

Red Hat/CentOS 6

  1. 创建一个新的配置文件

    通过复制相关目录,从现有配置文件创建新配置文件。此示例使用 virtual-guest配置文件作为基础,并用作 virtual-guest-no-thp新配置文件:

    sudo cp -r /etc/tune-profiles/virtual-guest /etc/tune-profiles/virtual-guest-no-thp
    
  2. 编辑ktune.sh

    编辑/etc/tune-profiles/virtual-guest-no-thp/ktune.sh 并将设置更改set_transparent_hugepages为以下内容:

    set_transparent_hugepages never
    
  3. 启用新的配置文件

    启用新的配置文件:

    sudo tuned-adm profile virtual-guest-no-thp
    

Red Hat/CentOS 7 和 8

  1. 创建一个新的配置文件。

    创建一个新目录来保存自定义tuned配置文件。此示例继承现有virtual-guest 配置文件,并用作virtual-guest-no-thp新配置文件:

    sudo mkdir /etc/tuned/virtual-guest-no-thp
    
  2. 编辑tuned.conf

    创建并编辑,/etc/tuned/virtual-guest-no-thp/tuned.conf使其包含以下内容:

    [main]
    include=virtual-guest
    
    [vm]
    transparent_hugepages=never
    

    此示例继承自现有virtual-guest 配置文件。选择最适合您的系统的配置文件。

  3. 启用新的配置文件

    启用新的配置文件:

    sudo tuned-adm profile virtual-guest-no-thp
    

参见

原文 - Disable Transparent Huge Pages (THP)

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""