- Why Do You Need HugePages ?
HugePages 属于Linux操作系统内核。配置了大页,那个系统将在“大页”和“小页”之间进行二选一。(默认读取数据为4KB)。 详细介绍参见: Document 361323.1
如果你有很大的内存或者SGA,那个配置大页将会是Oracle数据库性能调优的重要系统参数(比如大于8GB),那么你将需要配置HugePages,以下为配置SGA大小的注意事项,HugePages的建议:
- 更大的Pagesize & 更少的页面 (Larger Page Size and Less # of Pages):默认的page大小为4k,然而HugeTLB(HugeTables)大小为2048K。那么意味着操作系统需要至少处理512次page
- 减少页面的游走 (Reduced Page Table Walking):自从一个HugePages 覆盖一个较大的、连续的虚拟地址范围,而不是常规大小的页面,因此每个TLB条目的TLB命中率要比普通页面高。这减少了从虚拟地址获取物理地址的次数。
- 减少内存使用 (Less memory usage):从Oracle DB的观点出发。使用HugePages Linux内核参数,将会减少内存在创建pagetable时 提供虚拟物理内存映射给SGA地址的范围的 使用情况。
- 避免交换页 (No Swapping): 我们必须避免swapping 在Linux系统上的发生。HugePages是不可被swap的。(常规的pages是可以被交换的),所以这也没有page的替代机制,Hugepages被普遍的看做是一个解决方法。
- 没有 'kswapd' 操作(No 'kswapd' Operations) :如果有很大的区域被paged,那么kswapd将会非常繁忙。
- How to configure
Step 1
set in /etc/security/limits.conf.
设置memlock参数,此值稍小于内存即可。例: 64GB内存
* soft memlock 60397977
* hard memlock 60397977
* 将这个值设置为大于您的SGA要求是没有害处的。
Step 2
Re-logon to the Oracle product owner account (e.g. 'oracle') and check the memlock limit
$ ulimit -l
60397977
Step 3
如果你的数据库版本为 Oracle 11g 及以上版本开启了AMM特性,那么该特性与HugePages冲突。
则需要disable AMM特性。设置初始化参数 MEMORY_TARGET and MEMORY_MAX_TARGET to 0 (zero)
* 从11.2.0.3开始,如果DBCA检测到机器有超过4GB的RAM,那么AMM将不再被默认配置。Step 4
确保数据库实例启动,使用hugepages_setting.sh脚本,计算 vm.nr_hugepageskernel 参数建议值。Document 401749.1
$ ./hugepages_settings.sh
...
Recommended setting: vm.nr_hugepages = 1496
$
可参考我的博文:
HugePages -- 配置计算脚本
Step 5
设置 /etc/sysctl.conf ,需从起生效。
vm.nr_hugepages = 1496
Step 6
stop all database instance & reboot server
Step 7:
检查是否配置已生效 /proc/meminfo
# grep HugePages /proc/meminfo
HugePages_Total: 1496
HugePages_Free: 485
HugePages_Rsvd: 446
HugePages_Surp: 0