介绍
Oracle官方建议禁用透明大页,也就是Transparent HugePages,因为它可以在运行时导致内存延迟分配,进而导致Oracle数据库出现性能问题。
透明大页和标准大页不同,使用透明大页的话,内核khugepaged线程会在运行时动态地分配内存;使用标准大页,则会在启动时预先分配好内存,在运行时不会再发生更改。
环境
- CentOS 7.9
方案
方法一:使用grub2禁用透明大页
1、查看透明大页是否启用
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
说明:
- always 已启用
- madvise 只在MADV_HUGEPAGE的VMA中使用THP
- never 已禁用
从上图中看到,中括号框在always参数上,则说明透明大页已启用。
2、编辑配置文件
/etc/default/grub文件是开机启动项文件,我们可以在此文件的GRUB_CMDLINE_LINUX参数后面新增一条transparent_hugepage=never,来达到禁用透明大页的效果。
[root@localhost ~]# vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"
说明:
- GRUB_TIMEOUT 设置开始显示菜单等待的时间,说的再明白点,就是开机后有个图型界面让你选内核的那个时间。默认为5,单位为秒。设置为0,则立即启动而不显示菜单;设置为-1,则一直等待。
- GRUB_DISTRIBUTOR 获取Linux发型的版本,例如CentOS,则会显示CentOS Linux。
- GRUB_DEFAULT 设置引导时的默认启动项,也就是使用哪个内核启动。值可以是0-n,来指定以哪个内核来启动,也可以是saved。如下:
- 0-默认选择第一个菜单
- 1-默认选择第二个菜单
- n-默认选择n+1个内核启动
- saved-选择最后一次成功加载的操作系统,并且它还允许使用grub2-set-default和grub2-reboot命令来指定默认菜单,这两个命令的作用分别是:
- grub2-set-default 设置所有后续重启的默认菜单
- grub2-reboot 仅设置一下次重启的默认菜单
- GRUB_DISABLE_SUBMENU 指定菜单的类型,默认为True。值为false时,会为最高的内核版本生成顶级菜单,其他较低的内核版本会放在子菜单中;值为true时,列出所有内核的菜单。
- GRUB_TERMINAL_OUTPUT 设置终端输出的设备,该值取决于平台,多个值以空格分隔。例如:CentOS中该值默认是console(控制台)
- GRUB_CMDLINE_LINUX 指定内核启动的参数
- GRUB_DISABLE_RECOVERY 指定是否为内核生成恢复模式项,默认为True。 值为true时,只会生成默认项,不会生成恢复模式项,;为false时,除默认项外,还会生成恢复模式的一个菜单。
3、生效
配置好后,执行生效命令让刚刚修改的配置加入到启动项中。
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
4、重启并验证
重启服务器
[root@localhost ~]# reboot
重启后,我们再次查看透明大页是否启用。
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
从图中看到,已经是禁用的状态了。
方法二:使用脚本禁用透明大页
1、查看透明大页是否启用
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
说明:
- always 已启用
- madvise 只在MADV_HUGEPAGE的VMA中使用THP
- never 已禁用
从上图中看到,中括号框在always参数上,则说明透明大页已启用。
2、编辑/etc/rc.d/rc.local文件
[root@localhost ~]# vim /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
3、授权
默认情况下,/etc/rc.d/rc.local配置文件可能会没有执行权限导致我们配置的脚本在重启后没有生效,为预防出现不生效的情况,直接执行授权命令。
[root@localhost ~]# chmod +x /etc/rc.d/rc.local
4、重启后验证
授权执行完后,我们重启验证是否已禁用透明大页。
[root@localhost ~]# reboot
重启后,再次查看透明大页的状态
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
如上图所示,则说明透明大页已禁用。
评论区