引言
Oracle数据库是一个很吃内存的软件,生产环境安装数据库后需要开启大页来管理数据库内存的使用。同时需要关闭操作系统的透明大页,为什么要关闭透明大页呢?
由于透明大页已知会导致意外的节点重新启动并导致rac出现性能问题。因此oracle强烈建议禁用透明页。及时在单实例环境中透明大页也会导致性能问题,所以oracle 建议关闭操作系统上的透明大页。
现提供禁用方式,此次测试环境为redhat7.6,与其他版本略有不同,亲测有效
方法1
查看透明大页是否有值
[oracle@rhapp2 ~]$ cat /proc/meminfo |grep -i huge
AnonHugePages: 4096 kB
HugePages_Total: 184320
HugePages_Free: 184320
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
以上结果说明透明大页是开启状态
关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
查看结果
[oracle@rhapp2 ~]$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
再看取值
[oracle@rhapp2 ~]$ cat /proc/meminfo |grep -i huge
AnonHugePages: 4096 kB
HugePages_Total: 184320
HugePages_Free: 184320
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
透明大页依旧有值,关闭失败,不可取。
方法2:亲测有效
[root@rhapp2 ~]# cat /proc/meminfo |grep -i huge
AnonHugePages: 4096 kB
HugePages_Total: 184320
HugePages_Free: 184320
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
透明大页未关闭
[root@rhapp2 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
并且从方法一取值是never的
[root@rhapp2 ~]#
开始关闭操作
[root@rhapp2 ~]# cd /etc/default
[root@rhapp2 default]# cp grub grub_bak_0329
[root@rhapp2 default]# vi 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 rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/usr rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"
标红部分为新加字段
[root@rhapp2 default]#
[root@rhapp2 default]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak0329
配置生效
[root@rhapp2 default]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-957.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-957.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-3bb9aad0409c4a96a6297b2aa54f84a5
Found initrd image: /boot/initramfs-0-rescue-3bb9aad0409c4a96a6297b2aa54f84a5.img
done
[root@rhapp2 default]#
[root@rhapp2 default]# cat /proc/meminfo |grep -i huge
AnonHugePages: 4096 kB
HugePages_Total: 184320
HugePages_Free: 184320
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
以上发现透明大页有值,需要重启生效
[root@rhapp2 default]#
[root@rhapp2 default]# reboot
Session terminated, killing shell... ...killed.
再次查看透明大页也被关闭
[root@rhapp2 ~]# cat /proc/meminfo |grep -i huge
AnonHugePages: 0 kB
HugePages_Total: 184320
HugePages_Free: 183554
HugePages_Rsvd: 19
HugePages_Surp: 0
Hugepagesize: 2048 kB
方法可行
方法3:修改/etc/default/grub,方法2的加强版(Linux7/8推荐使用)
透明大页查看
[root@enmo1 ~]# cat /proc/meminfo |grep -i huge
AnonHugePages: 2048 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
接下来修改、生效、重启三部曲,简单快速
[root@enmo1 ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/rootvg-root ro crashkernel=auto rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/swap rd.lvm.lv=rootvg/usr rhgb quiet LANG=en_AU.UTF-8
[root@enmo1 ~]# cat /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 rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/swap rd.lvm.lv=rootvg/usr rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
[root@enmo1 ~]#
修改
[root@enmo1 ~]# sed -i 's/quiet/quiet transparent_hugepage=never/' /etc/default/grub
[root@enmo1 ~]# cat /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 rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/swap rd.lvm.lv=rootvg/usr rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"
生效
[root@enmo1 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-957.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-957.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-7482022d97e242dbbe5d7b753f1222f6
Found initrd image: /boot/initramfs-0-rescue-7482022d97e242dbbe5d7b753f1222f6.img
Done
重启操作系统
reboot.....
以下两条命令都能验证
[oracle@enmo1 ~]$ cat /proc/meminfo |grep -i huge
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
[oracle@enmo1 ~]$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/rootvg-root ro crashkernel=auto rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/swap rd.lvm.lv=rootvg/usr rhgb quiet transparent_hugepage=never
[oracle@enmo1 ~]$
方法4:通过修改rc.lcoal(linux6 建议使用)
关闭透明大页:
cat >>/etc/rc.d/rc.local <<EOF
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
EOF
关闭 numa:
sed -i 's/quiet/quiet numa=off/' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
suse操作系统略有不同
# 重启后失效
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 开机时设置never到以上文件中
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/init.d/boot.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/init.d/boot.local
chmod +x /etc/init.d/boot.local
综上所述:
Linux6 建议使用方法4,linux7/8建议使用方法3。透明大页是否关闭验证有很多方法。