CENTOS 7(LINUX 7)关于禁用透明大页的实验#干货盘点#

满堂花醉三千客,一剑霜寒十四州。这篇文章主要讲述CENTOS 7(LINUX 7)关于禁用透明大页的实验#干货盘点#相关的知识,希望能为你提供帮助。
            最近,在对oracle数据库服务器操作系统做禁用透明大页,原因很简单,就是透明大页会导致oracle数据库尤其是rac数据库不稳定。但是,浏览网上大概有三种禁用centos7或者linux7透明大页的方法,经过实验测试,只有一种是彻底禁用centos7或者linux7透明大页的方法,其余的透明大页禁用方法都存在问题。
一、确定当前系统是否开启大页
root登陆操作系统执行如下命令:

grep AnonHugePages /proc/meminfo
cat /sys/kernel/mm/transparent_hugepage/enabled

观察命令执行结果,AnonHugePages不为0和[always]结果输出表示系统启用了透明大页。

二、禁用centos7或者linux7透明大页
1.第一种修改rc.local方式
#编辑/etc/rc.local,在文件最后追加如下内容

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

重启操作系统测试,如下图所示透明大页还是启用和使用状态:

说起,rc.local,/etc/rc.d/rc.local与/etc/rc.local同名,那么修改/etc/rc.d/rc.local能禁用centos7或者linux7的透明大页吗?实验验证:
#编辑/etc/rc.local,在文件最后删除如下内容

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

#编辑/etc/rc.d/rc.local,在文件最后追加如下内容

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

赋予执行权限
chmod +x /etc/rc.d/rc.local

重启操作系统测试,测试如下图所示,AnonHugePages不为0,说明内核进程在使用透明大页,也就是说内核进程级别没有彻底禁用掉透明大页。

小结:我使用的是vmware做的虚拟机,虚拟机有centos7的、也有redhat7的(在为客户实施透明大页关闭时发现此种方法AnonHugePages不为0),经过多台机器测试,发现并不是所有的机器AnonHugePages不为0,是不是透明大页禁用方法的问题,抑或是操作系统版本的问题,没有找到具体的原因。
2.第二种系统服务方式
#清理第一种方式中的/etc/rc.d/rc.local禁用透明大页添加的内容
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

操作系统服务级别禁用透明大页
#编辑禁用透明大页的服务文件disable-thp.service
vi /etc/systemd/system/disable-thp.service
[Unit]
Description=Disable Transparent Huge Pages (THP)

[Service]
Type=simple
ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled & & echo never > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

#启用和启动disable-thp.service透明大页禁用服务
systemctl daemon-reload
systemctl start disable-thp
systemctl enable disable-thp

第一次重启操作系统测试,结果输出如下图所示,AnonHugePages为0和[never],说明透明大页禁用成功。

第二次重启操作系统测试,发现AnonHugePages不为0,说明系统内核进程还是在使用透明大页。

小结:后来通过systemctl status disable-thp查看发现disable-thp.service没有运行,即使手工systemctl start disable-thp后依然是dead状态。
3.第三种系统内核grub方式
--清理编辑的服务文件
[root@centos7 ~]# rm -rf/etc/systemd/system/disable-thp.service
[root@centos7 ~]#

--修改系统grub文件
vi /etc/sysconfig/grub
修改位置
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet numa=off"
修改后
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet numa=off transparent_hugepage=never"

--执行新的grub文件生成
grub2-mkconfig
[root@centos7 ~]# grub2-mkconfig
Generating grub configuration file ...
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set pager=1

if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "$next_entry" ] ; then
set default="$next_entry"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="$saved_entry"
fi

if [ x"$feature_menuentry_id" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi

export menuentry_id_option

if [ "$prev_saved_entry" ]; then
set saved_entry="$prev_saved_entry"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi

function savedefault
if [ -z "$boot_once" ]; then
saved_entry="$chosen"
save_env saved_entry
fi


function load_video
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi


terminal_output console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
set tuned_initrd=""
### END /etc/grub.d/00_tuned ###

### BEGIN /etc/grub.d/01_users ###
if [ -f $prefix/user.cfg ]; then
source $prefix/user.cfg
if [ -n "$GRUB2_PASSWORD" ]; then
set superusers="root"
export superusers
password_pbkdf2 root $GRUB2_PASSWORD
fi
fi
### END /etc/grub.d/01_users ###

### BEGIN /etc/grub.d/10_linux ###
Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img
menuentry CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core) --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option gnulinux-3.10.0-693.el7.x86_64-advanced-36d1d2c6-5b46-4950-912a-0dd81395b786
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod xfs
set root=hd0,msdos1
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint=hd0,msdos14c19bd89-7af5-47bf-8c2e-795436b6c164
else
search --no-floppy --fs-uuid --set=root 4c19bd89-7af5-47bf-8c2e-795436b6c164
fi
linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet numa=off transparent_hugepage=never
initrd16 /initramfs-3.10.0-693.el7.x86_64.img

Found linux image: /boot/vmlinuz-0-rescue-eb2f89b8b4d145f79a4f9960d74dfb3a
Found initrd image: /boot/initramfs-0-rescue-eb2f89b8b4d145f79a4f9960d74dfb3a.img
menuentry CentOS Linux (0-rescue-eb2f89b8b4d145f79a4f9960d74dfb3a) 7 (Core) --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option gnulinux-0-rescue-eb2f89b8b4d145f79a4f9960d74dfb3a-advanced-36d1d2c6-5b46-4950-912a-0dd81395b786
load_video
insmod gzio
insmod part_msdos
insmod xfs
set root=hd0,msdos1
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint=hd0,msdos14c19bd89-7af5-47bf-8c2e-795436b6c164
else
search --no-floppy --fs-uuid --set=root 4c19bd89-7af5-47bf-8c2e-795436b6c164
fi
linux16 /vmlinuz-0-rescue-eb2f89b8b4d145f79a4f9960d74dfb3a root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet numa=off transparent_hugepage=never
initrd16 /initramfs-0-rescue-eb2f89b8b4d145f79a4f9960d74dfb3a.img

if [ "x$default" = CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core) ]; then default=Advanced options for CentOS Linux> CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core); fi;
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.Simply type the
# menu entries you want to add after this comment.Be careful not to change
# the exec tail line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f$config_directory/custom.cfg ]; then
source $config_directory/custom.cfg
elif [ -z "$config_directory" -a -f$prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
done
[root@centos7 ~]#

执行grub2-mkconfig -o /boot/grub2/grub.cfg,使系统使用新的grub.cfg文件
[root@centos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-eb2f89b8b4d145f79a4f9960d74dfb3a
Found initrd image: /boot/initramfs-0-rescue-eb2f89b8b4d145f79a4f9960d74dfb3a.img
done
[root@centos7 ~]#

--重启操作系统
reboot

【CENTOS 7(LINUX 7)关于禁用透明大页的实验#干货盘点#】经过多次重启验证,结果输出如下图所示,AnonHugePages为0和[never],说明透明大页彻底禁用成功。

总结:针对linux 7禁用透明大页空间,网络上流行的方法有三种,修改rc.local和编辑系统服务文件方式均可能存在问题,编辑系统内核引导文件grub.cfg可以完全禁用透明大页。

    推荐阅读