我想在 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.local
和cloud.cfg
文件中,但没有成功。
我还尝试将设置附加transparent_hugepage=never
到内核行/etc/grub.conf
(如解释的那样那里),但效果并没有更好。
那么... 如何在 AWS EC2 实例上运行的 CentOS 7 上禁用 THP?
编辑:更改标题...我需要禁用 THP和THP 碎片整理
答案1
解决方案是调整,正如@michael-hampton 指出的那样。棘手的部分是虚拟机插件只能配置/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
请注意,此配置文件继承自虚拟访客,这是我的活动配置文件,实际上看起来适合虚拟化服务器 (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]
重启后它将继续存在。
答案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
答案3
也可以尝试一下
nano /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
sudo chmod 755 /etc/init.d/disable-transparent-hugepages
sudo chkconfig --add disable-transparent-hugepages
答案4
编辑:上面的回复是错误的,因为目前 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 探测