内存页的大小默认是4K,在大内存下内存页的数量会非常多,管理起来开销会很大。采用hugepages技术,内存页增加到2M,极大的减少了内存管理中映射表的条目,提高了效率。更重要的是,实现了各进程间的页表(page tables)共享,降低了高并发进程占用过多的内存。oracle11.2.0.3下hugepages的设置步骤也很简单:
1、通过free命令查看当前系统内存大小,然后在/etc/security/limits.conf中增加两行
oracle soft memlock 内存大小(free命令查看到的mem值)
oracle hard memlock 内存大小
2、oracle从AMM切换到ASMM。
create pfile from spfile;将pfile中memory_max_target、memory_target两个参数删除。
shutdown immediate
startup pfile=‘xxx'
修改好sga、pga等参数,create spfile from pfile;
shutdown immediate
startup
3、在oracle用户下,使用oracle推荐的hugepages_settings.sh脚本计算系统需要设置的hugepage数目。
手工计算也可,sga的值(M)除以2,再加上2。
在/etc/sysctl.conf中增加vm.nr_hugepages=计算结果。
4、重启服务器(执行sysctl -p 也可让内核参数生效)。
11.2.0.3版本的oracle会自动优先使用hugepage内存。
hugepage不会被swap,也不能被其它进程共享,所以不可设置过大,跟sga_max_target一样大即可。
另外,Linux 默认开启Transparent HugePages(透明大页)。该功能本来是为了实现HugePage的动态分配和自动管理,但由于该项功能会导致数据库出现故障,因此强烈建议在数据库服务器上关闭此项功能。
查看透明大页是否开启:
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[]中的值为never时表示禁用。
关闭透明大页步骤:编辑系统文件/etc/default/grub,在参数GRUB_CMDLINE_LINUX中添加“transparent_hugepage=never”;执行命令grub2-mkconfig -o /boot/grub2/grub.cfg后重启系统。