HugePage,就是指的大页内存管理方式。与传统的4kb的普通页管理方式相比,HugePage为管理大内存(8GB以上)更为高效。对于8GB以上的内存以及较大的Oracle SGA size,建议配值并使用HugePage特性。
linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会按照LRU算法在适当的时候将物理内存中不经常使用的内存页自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。通常情况下,Linux默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。因此Hugepage便因此而来。也就是打破传统的小页面的内存管理方式,使用大页面2m,4m,16m等等。如此一来映射条目则明显减少。如果系统有大量的物理内存(大于8G),不管物理32位的操作系统还是64位的,都应该使用Hugepage。
对于较大的系统内存以及sga,使用hugepage可以极大程度的提高Oracle数据库性能。
怎么样设置hugepages?设置hugepages有什么注意事项同?
a、HugePage使用的是共享内存,在操作系统启动期间被动态分配并被保留,因为他们不会被置换。
b、由于不会被置换的特点,在使用hugepage的内存不能被其他的进程使用。所以要合理设置该值,避免造成内存浪费。
c、对于只使用Oracle的服务器来说,把Hugepage设置成SGA(所有instance SGA之和)大小即可。
d、如果增加HugePage或添加物理内存或者是当前服务器增加了新的instance以及SGA发生变化,应该重新设置所需的HugePage。
e、reference: HugePages on Linux: What It Is... and What It Is Not... [ID 361323.1] To Bottom
配置hugepages步骤:
1.查看当前系统是否配值HugePages
Hugepagesize为2MB,HugePages_Total为0说明没有配置hugepages
[oracle@qht115 ~]$ grep Huge /proc/meminfo
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
2.通过修改/etc/security/limits.conf 配值文件来实现
该参数的值通常配值位略小于当前的已安装系统内存,我的系统是8G内存,不过只显示7G内存,可能是用的集成显卡被吃掉1G
[root@qht115 ~]# free -m
total used free shared buffers cached
Mem: 6975 4910 2065 0 291 4279
-/+ buffers/cache: 339 6635
Swap: 8189 516 7672
--hugepagesize设为6G
[root@qht115 ~]# cat /etc/security/limits.conf
# for oracle 10g
oracle soft nofile 65536
oracle hard nofile 65536
* soft memlock 6291456
* hard memlock 6291456
[root@qht115 ~]# ulimit -l
6291456
[root@qht115 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144
kernel.shmall = 2097152
kernel.shmmax = 8589934591
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
3.禁用AMM,AMM是oracle 11G的新功能,oracle10g 可忽略些步骤
如果当前的Oracle 版本为11g,由于AMM(Automatic Memory Management)特性与Hugepages不兼容,需要禁用AMM。
ALTER SYSTEM RESET memory_target SCOPE=SPFILE;
ALTER SYSTEM RESET memory_max_target SCOPE=SPFILE;
ALTER SYSTEM SET sga_target=<n>g SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=<n>g SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
4.计算vm.nr_hugepages 的值
使用Oracle 提供的脚本hugepages_settings.sh的脚本来计算vm.nr_hugepages的值
在执行脚本之前确保所有的Oracle 实例已启动以及ASM也启动(存在的情形下)
[oracle@qht115 ~]$ ./hugepages_setting.sh
。。。
Recommended setting: vm.nr_hugepages = 434
5.编辑/etc/sysctl.conf 来设置vm.nr_hugepages参数
[root@qht115 ~]# cat /etc/sysctl.conf
增加
vm.nr_hugepages = 434
[root@qht115 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144
kernel.shmall = 2097152
kernel.shmmax = 8589934591
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
vm.nr_hugepages = 434
6.重启Instance,看是否用了hugepagesize
重启数据库后,查看使用情况:
[oracle@qht115 ~]$ grep Huge /proc/meminfo
HugePages_Total: 434
HugePages_Free: 321
HugePages_Rsvd: 320
Hugepagesize: 2048 kB
的确hugepage的确被用上了。
前面说过Hugepages可以设置为sga的总大小,测试将hugepages变大,我的sga不到3G,所以将HugePages_Total设为1536,3G大小。
1.更改/etc/sysctl.conf的参数vm.nr_hugepages = 1536
2.sysctl -p
3.重启数据库
4.一切正常,唯一担心的就是这个数值不是hugepages_setting.sh脚本所建议的值。不过应该没有关系,这个脚本应该是根据当前数据库的使用情况来建议这个数值的,这台测试机器本身没有业务所以计算的值会偏小很多。
[oracle@qht115 ~]$ grep Huge /proc/meminfo
HugePages_Total: 1536
HugePages_Free: 1423
HugePages_Rsvd: 320
Hugepagesize: 2048 kB
参考: