HugePages在linux kernel 2.6被完整引进,其目的是为了提供更大的内存页面以便于更好的支持大内存。uname -a
在linux中,默认的内存页面是4096字节,而现行物理设备中,内存动辄几十G,当系统运行内存较大的应用程序(比如数据库)时,过小的内存页面会产 生大量的TLB miss和缺页中断,将大大降低程序性能。Hugepages提供了2M到256M的大内存页面(大小取决于内核版本和物理架构)来代替默认的页面大小.
使用Hugepages可以得到更好的性能,因为Hugepages不可交换,可以避免内存的换入换出,对一个Oracle database,可以将使用的SGA作为Hugepages钉住,会整体上提升db的性能。Oracle推荐在64bit Linux上对大内存数据库使用Hugepages.
以RHEL4 64bit为例,配置Hugepages过程如下:
1 更改os参数,配置Hugepages大小
Hugepages需设置为比SGA略大一点,过大的设置会造成内存浪费,过小则会造成无法使用。
(1)修改/etc/sysctl.conf参数,增加vm.nr_hugepages=”<total_size>/< Hugepagesize>”,并使之生效
注意vm.nr_hugepages的单位,其值为需要设置成Hugepages的总内存大小/Hugepages的页面大小.
HugePages的页面大小可以这样获得:
[root@jss01 ~]# grep Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB
(2) 修改/etc/security/limits.conf,增加locked memory的最大限制,设置成大于等于sga大小。
* soft memlock <total_size>
* hard memlock <total_size>
2.重新启动db,检查是否生效
[root@jss01 ~]# grep Huge /proc/meminfo
HugePages_Total: 4000
HugePages_Free: 0
Hugepagesize: 2048 kB
HugePages_Free表示剩余的大内存页面数,应该是接近为0的数字。
在32bit OS中,使用Hugepages是为了配合大内存扩展,由于32bit OS的寻址空间限制,使用的SGA有限。尽管可以通过降低Oracle软件的mapped_base(挂载地址)来实现sga的扩展,但无法突破4G制 约。而通过VLM (Very Large Memory)技术,hugemem内核的OS可以将SGA最大内存扩展到62Gb(smp内核最大支持14Gb SGA).在kernel 2.6之后,实现VLM可以借助hugepages+in-memory filesystem (ramfs)。
需注意的是,使用VLM,将不能使用SGA自动动态调整功能。
以RHEL4 32bit为例,具体步骤如下:
1.创建ramfs
[root@jss01 ~]umount /dev/shm
[root@jss01 ~]mount -t ramfs ramfs /dev/shm
[root@jss01 ~]chown oracle:oinstall /dev/shm
2.配置os参数和Hugepages大小(步骤略,同上)
3.配置db parameter
32bit扩展大内存需要牺牲掉一些特性,参数文件里面,需要做如下改动:
(1) 移除DB_CACHE_SIZE/DB_xK_CACHE_SIZE等参数,用以老参数DB_BLOCK_BUFFERS代替。
(2) 设置 USE_INDIRECT_DATA_BUFFERS=TRUE
(3) 移除sga_target(11g memory_target/memory_max_target)等参数
4.重启instance/验证
对于不存在Hugepages功能的更早的一些内核版本(比如RHAS 2,可以通过bigpages+in-memory filesystem(shmfs)来实现大内存扩展.
注意,与在32bit下VLM使用Hugepages不同的是,在64bit Linux下使用Hugepages并不需要修改数据库参数。当然,在物理设备飞速发展的今天,还是尽快升级到你手头的32bit OS到64bit OS上来吧,何必在去为一些内存扩展苦苦折腾.