翻译自https://docs.oracle.com/database/121/UNXAR/appi_vlm.htm#UNXAR391
G.1HugePages概述
HugePages是集成到Linux内核2.6中的功能。启用HugePages使操作系统可以支持大于默认值(通常为4 KB)的内存页。使用非常大的页面大小可以通过减少访问页面表条目所需的系统资源量来提高系统性能。HugePages对于32位和64位配置都是有用的。HugePage的大小从2 MB到256 MB不等,具体取决于内核版本和硬件体系结构。对于Oracle数据库,使用HugePages可以减少页面状态的操作系统维护,并提高转换后备缓冲区(TLB)的命中率。
注意:Transparent Hugepages当前不是手动配置HugePages的替代方法。
G.1.1使用Hugepages调整SGA
没有HugePages,操作系统将每个4kb的内存作为一个页面。当它向数据库系统全局区域(SGA)分配页时,操作系统内核必须为分配给SGA的每一个4KB的页使用页生命周期(脏页、空闲页、映射到进程等)不断更新其页表。
使用HugePages,操作系统页表(虚拟内存到物理内存的映射)更小,因为每个页表条目指向的页从2MB到256MB。
而且,内核的生命周期必须被监视的页面更少。例如,如果在64位硬件上使用HugePages,并且要映射256 MB内存,则可能需要一个页表条目(PTE)。如果不使用HugePages,并且要映射256MB的内存,则必须有256MB*1024KB/4KB=65536PTE。
HugePages具有以下优点:
- 通过提高TLB命中率来提高性能
- 页面被锁定在内存中并且永不交换,这为共享内存结构(例如SGA)提供了RAM
- 连续的页面已预先分配,不能用于System V共享内存(例如SGA)
- 由于较大的页面大小,因此对于虚拟内存的那部分内核的簿记工作较少
G.1.2在Linux上配置HugePages
完成以下步骤以在计算机上配置HugePages:
- 运行以下命令以确定内核是否支持HugePages:
$ grep Huge /proc/meminfo
- 某些Linux系统默认不支持HugePages。对于此类系统,请使用CONFIG_HUGETLBFS和CONFIG_HUGETLB_PAGE配置选项构建Linux内核。CONFIG_HUGETLBFS位于“文件系统”下,CONFIG_HUGETLB_PAGE选择时处于选中状态CONFIG_HUGETLBFS。
- 在/etc/security中编辑memlock设置/极限.conf文件。memlock设置以KB为单位指定,当启用HugePages内存时,最大锁定内存限制应至少设置为当前RAM的90%,禁用HugePages内存时,最大锁定内存限制应设置为至少3145728 KB(3 GB)。例如,如果安装了64 GB RAM,则添加以下条目以增加最大锁定内存地址空间:
* soft memlock 60397977
* hard memlock 60397977
您还可以将memlock值设置为高于SGA要求。
- oracle再次以用户身份登录并运行ulimit -l命令以验证新memlock设置:
$ ulimit -l
60397977
- 运行以下命令以显示Hugepagesize变量的值:
$ grep Hugepagesize /proc/meminfo
- 完成以下过程,创建一个脚本,该脚本计算hugepages当前共享内存段的配置建议值:
创建一个名为的文本文件hugepages_settings.sh。
在文件中添加以下内容:
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}`
# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
NUM_PG=1
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
do
MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
if [ $MIN_PG -gt 0 ]; then
NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
fi
done
# Finish with results
case $KERN in
'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
'2.6'|'3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
*) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End
运行以下命令来更改文件的权限:
$ chmod +x hugepages_settings.sh
- 运行hugepages_settings.sh脚本以计算hugepages配置值:
$ ./hugepages_settings.sh
注意:在运行此脚本之前,请确保所有使用的应用程序都在hugepages运行。
- 设置以下内核参数,其中value是您在步骤7中确定的HugePages值:
# sysctl -w vm.nr_hugepages=value
- 为了确保在系统重启后分配了HugePages,请将以下条目添加到/etc/sysctl.conf文件中,其中value是您在步骤7中确定的HugePages值:
vm.nr_hugepages=value
- 运行以下命令以检查可用的hugepages:
$ grep Huge /proc/meminfo
- 重新启动实例。
- 运行以下命令以检查可用的hugepages页面(可用1或2页):
以下是一个示例输出,显示由于[always]启用了标记,正在使用Transparent HugePages 。
$ grep Huge /proc/meminfo
注意:如果您无法使用来设置HugePages分配nr_hugepages,那么您的可用内存可能会碎片化。重新启动服务器以使“HugePages”分配生效。
G.1.3 HugePages配置的限制
HugePages具有以下限制:
- 您必须同时取消设置MEMORY_TARGET和MEMORY_MAX_TARGET初始化参数。例如,要取消设置数据库实例的参数,请使用命令ALTER SYSTEM RESET。
- 自动内存管理(AMM)和HugePages不兼容。使用AMM时,通过在下创建文件来分配整个SGA内存/dev/shm。当Oracle数据库通过AMM分配SGA时,不会保留HugePages。要在Oracle数据库12使用大页面Ç,您必须禁用AMM。
- 如果在32位环境中使用VLM,则不能将HugePages用于数据库缓冲区高速缓存。您可以使用的SGA的其他部分,如大页面shared_pool,large_pool等。VLM(缓冲区高速缓存)的内存分配是使用共享内存文件系统(ramfs/tmpfs/shmfs)完成的。内存文件系统不保留或使用HugePages。
- 除非系统管理员通过修改可用页面数或通过修改池大小来更改HugePages配置,否则HugePages不会在系统启动后进行分配或释放。如果在系统启动期间未在内存中保留所需的空间,则HugePages分配将失败。
- 确保正确配置了HugePages,因为如果应用程序未使用过多的HugePages,则系统可能会耗尽内存。
- 如果在实例启动且初始化参数use_large_pages设置only为时没有足够的HugePages ,则数据库将无法启动,并且警报日志消息会提供有关Hugepages的必要信息。
G.1.4禁用透明大页面
缺省情况下,Red Hat Enterprise Linux 6,SUSE 11和Oracle Linux 6以及Oracle Linux Unbreakable Enterprise Kernel 2(UEK2)内核的较早版本默认启用透明HugePages内存。在更高版本的UEK2内核中,默认情况下禁用透明HugePages内存。
透明的HugePages可能会在运行时导致内存分配延迟。为避免性能问题,Oracle建议您在所有Oracle数据库服务器上禁用“透明HugePages”。Oracle建议您改用标准HugePages来增强性能。
透明HugePages内存与标准HugePages内存不同,因为内核khugepaged线程在运行时动态分配内存。标准HugePages内存在启动时已预先分配,并且在运行时不会更改。
要检查是否启用了透明HugePages,请以root用户身份运行以下命令之一:
红帽企业Linux内核:
# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
其他内核:
# cat /sys/kernel/mm/transparent_hugepage/enabled
注意:
如果从内核中删除了透明HugePages,则/sys/kernel/mm/transparent_hugepage或/sys/kernel/mm/redhat_transparent_hugepage文件不存在。
要禁用透明HugePage,请执行以下步骤:
将以下条目添加到/etc/grub.conf文件中的内核引导行中:
transparent_hugepage=never
例如:
title Oracle Linux Server (2.6.32-300.25.1.el6uek.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-300.25.1.el6uek.x86_64 ro root=LABEL=/ transparent_hugepage=never
initrd /initramfs-2.6.32-300.25.1.el6uek.x86_64.img