背景
顾名思义,翻译过来就是大页技术,页可以简单理解为内存块。
我是在oracle数据库服务器应用这个技术的,因为数据库使用过程中,最怕出现的性能问题就是出现SWAP(内存不够用,使用硬盘作为虚拟内存),这个动作效率特别低,所以宁可等待内存资源,也不要换页,一旦SQL频繁swap,就要进入漫长的等待了。
原理
使用hugepage的内存,不会进行swap,而oracle的SGA如果配了hugepage,就会默认使用hugepage。在操作系统层面设置好hugepage后,重启服务器,启动数据库,SGA就会占用hugepage。所以hugepage的设置要比SGA稍微大一点。
操作步骤
hugepage配置
1.修改 /etc/security/limits.conf 文件,增加以下内容:
* soft memlock unlimited
* hard memlock unlimited
检查:ulimit -l
2.看看当前hugepage每页大小
grep -i huge /proc/meminfo
hugepage大小等于页数*每页大小,要比SGA稍大
3.修改/etc/sysctl.conf
配置hugepage页数
vm.nr_hugepages = XXX ##页数
##使生效
sysctl -p
4.查看是否启用hugepage
show parameter USE_LARGE_PAGES;
为true则是启用
其他相关配置
关闭AMM
这个在数据库里和hugepage冲突
SHOW PARAMETER MEMORY;
如果memory_max_target、memory_target都是0说明没启用
关闭THP
这个在操作系统层面和hugepage冲突
sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="transparent_hugepage=never /g' /etc/default/grub
sysctl -p
检查:
cat /sys/kernel/mm/transparent_hugepage/enabled
UEFI
## 判断操作系统是否使用UEFI方式启动 ##
ls -ld /sys/firmware/efi
## 如果上面查询目录存在使用如下方式重建grub配置文件(针对EFI方式) ##
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
## 否则使用如下方式重建grub配置文件(针对BIOS方式) ##
grub2-mkconfig -o /boot/grub2/grub.cfg
关闭 NUMA
如果只有一个node可以不做这步:
dmesg |grep -i numa
检查操作系统是否开启 NUMA
#(ROOT)
dmesg | grep -i numa
注:如果输出结果为 No NUMA configuration found 则表明 NUMA 没有开启,否则使用如下方法关闭
#(ROOT)
sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="numa=off /g' /etc/default/grub
## 生效 ##
sysctl -p
重启操作系统和数据库
检查
grep -i huge /proc/meminfo
如果hugepage总大小生效、free大小小于总大小,说明成功被使用了。(正常free就是总大小减去SGA大小)