在CentOS 7 EC2实例上禁用THP和THP碎片整理


9

我想在默认启用的CentOS 7 EC2实例上禁用transparent_hugepage(THP):

# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

可以手动更改此设置:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

...但是更改在重新启动后会丢失。

我试图将echo never [...]指令放入我的rc.localcloud.cfg文件中,但是没有用。

我还尝试将设置附加transparent_hugepage=never到的内核行/etc/grub.conf(如那里所述),但效果不佳。

那么...如何在AWS EC2实例上运行的CentOS 7上禁用THP?

编辑:更改标题...我需要禁用THP THP碎片整理


为了利益,请问您为什么要禁用THP?
卡梅隆·克尔


重新启动后,如果您“将transparent_hugepage = never附加到/etc/grub.conf的内核行”,您的即时通讯将不起作用,并且需要从grub文件中删除该行。为此,我们可以将现有实例附加到新实例,然后将分区安装到文件夹
Artem.Borysov,2016年

Answers:


14

正如@ michael-hampton所指出的,该解决方案已调整。棘手的是,vm插件只能配置/sys/kernel/mm/transparent_hugepage/enabled设置。

要也禁用该/sys/kernel/mm/transparent_hugepage/defrag设置,我必须创建一个脚本,该脚本在启动时由配置文件调用。

最后,完整的解决方案是:

步骤1:创建目录以保存自定义配置文件:

mkdir /etc/tuned/custom

第2步:创建配置文件/etc/tuned/custom/tuned.conf

[main]
include=virtual-guest

[vm]
transparent_hugepages=never

[script]
script=script.sh

请注意,此配置文件继承自virtual-guest,这是我的活动配置文件,实际上看起来适合于虚拟服务器(EC2)。您可以使用命令查看活动的配置文件tuned-adm active。如果您好奇,可以在以下位置查看预定义配置文件的内容/usr/lib/tuned/

步骤3:创建脚本/etc/tuned/custom/script.sh

#!/bin/sh

. /usr/lib/tuned/functions

start() {
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    return 0
}

stop() {
    return 0
}

process $@

使它可执行:

sudo chmod 755 /etc/tuned/custom/script.sh

步骤4:激活新的配置文件:

tuned-adm profile custom

现在您应该得到:

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

重新启动后它将继续存在。


我们发现这在AWS Redhat 7.4 VM上有效。谢谢!
乔恩·桑普森

2

除了设置grub命令行外,还需要配置tuned。但是,由于不正确,因此不使用您链接的说明,因为它们充满了错误,需要半天的时间才能对它们进行解释。

创建一个自定义调整后的配置文件(我将其称为custom),然后设置该配置文件。您将以现有配置文件为基础,例如,virtual-guest如果您正在虚拟机中运行(当然是EC2),或者throughput-performance是在物理机上。

创建目录以保存定制概要文件:

mkdir /etc/tuned/custom

创建自定义配置文件/etc/tuned/custom/tuned.conf,例如:

[main]
include=virtual-guest

[vm]
transparent_hugepages=never

现在设置配置文件:

tuned-adm profile custom

那些指令充满错误?需要半天才能解释?这就是我想要了解的。
vcarel 2015年

我不明白你的回答。为什么我必须配置grub 完全使用调优?
vcarel 2015年

1
因为它在内核配置中默认为打开,在调整后的配置中默认为打开。您需要同时更改两者才能使其完全有效。
迈克尔·汉普顿

1
配置调整似乎就足够了...我不必更改grub的配置。顺便说一句,是否还有另一个调整的设置也可以禁用THP碎片整理?
vcarel 2015年

@vcarel不必要,因为透明的大页面已被禁用!
迈克尔·汉普顿

1

也试试这个

纳米/etc/init.d/disable-transparent-hugepages

#!/bin/sh
### 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' > ${thp_path}/enabled
    echo 'never' > ${thp_path}/defrag

    unset thp_path
    ;;
esac

须藤chmod 755 /etc/init.d/disable-transparent-hugepages

须藤chkconfig --add disable-transparent-hugepages


0

您可以编辑/etc/rc.local文件,并将以下命令添加到该文件:

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

并运行chmod +x /etc/rc.d/rc.local以确保脚本将在引导期间执行。在Amazon Linux 2上进行了测试。


-2

编辑:上面的答复是错误的,因为这时sysctl中缺少透明的大页面旋钮。对不起,噪音。


您可以在中输入所需的值/etc/sysctl.conf

从sysctl.conf(5)手册页:

SYSCTL.CONF(5)文件格式SYSCTL.CONF(5)

名称
       sysctl.conf-sysctl预加载/配置文件

描述
       sysctl.conf是一个简单的文件,其中包含要由sysctl读取和设置的sysctl值。语法简单如下:

              #条评论
              ; 评论

              代币=价值

       请注意,尽管值可以在其中包含空格,但是将忽略空白行,并忽略标记或值之前和之后的空格。以#或;开头的行 被考虑
       评论和忽略。

例
              #sysctl.conf示例
              #
                kernel.domainname = example.com
              ; 这一个空间将被写入sysctl!
                kernel.modprobe = / sbin / mod探针

1
不能使用sysctl进行配置。
迈克尔·汉普顿

为什么?我经常使用sysctl.conf调整/ sys / Knowbs ...我在这里缺少什么?编辑:没关系,我在RHEL文档中找到了它。感谢为我指出这一点;)
shodanshok
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.