开启HugePages特性(SuSE)

Posted by Harid七月 - 19 - 2014 Leave comments

HugePages是Linux kernel下内存管理的特性功能,一般在使用大RAM和SGA的情况下,Oracle推荐使用HugePages功能以增强系统稳定性。

在使用大RAM和SGA的情况下,例如在SGA大于8GB的情况下,Oracle进程要消耗大量的共享内存,也就是消耗pagetable的大小。这是因为缺省page size只有4KB,而每个page页都会使用一个pagetable,导致在大内存的情况下,page页数量很大,会消耗大量pagetable的尺寸。在这种情况下,Oracle推荐使用Hugepages。

使用HugePages的好处如下:

1、一般情况下内存中的page size缺省值是4KB,而hugepage size根据内核版本和硬件架构从2MB到256MB不等,这样使pagetable的数量和总的尺寸会大量减少。

2、使CPU的系统调用减少,不用大量去做内存回收等工作,比如系统调用kswapd进程的使用会大量减少。

3、优化了系统内存的使用效率,由于hugepage的大的page size会减少page的数量,使系统减少对page的操作消耗,从而节省系统资源。

4、由于利用HugePages,会使pagetable的尺寸减小,同时保证了剩余内存空间的使用,避免了SWAP交换区溢出现象。

如果不设置HugePages,数据库将出现消耗SWAP的情况,此时业务响应变的非常慢,系统将极为不稳定。

开启HugePages:

1、备份spfile或者创建pfile;

2、检查/dev/shm的大小,保证/dev/shm的大小大于我们欲设置的SGA的大小,一般设置/dev/shm的大小为物理内存的一半(内存大于8GB)或者等于物理内存的大小(物理内存小于8GB);

3、修改/etc/sysctl.conf中的内核参数。主要设置“kernel.shmall”、“kernel.shmmax”、“kernel.shmmni”三个内核参数的值。手上这台服务器的内存为128GB,而且仅仅用作数据库服务器,我们欲设置SGA的大小为70GB,PGA为30GB。因此,设置kernel.shmmax比较大,有100GB,以允许整个SGA可以容纳在一个共享内存段中。具体修改如下:

kernel.shmall = 33554432
kernel.shmmax = 107374182400
kernel.shmmni = 4096

4、使得内核参数的修改生效,执行:

1
sysctl -p

5、由于Oracle的AMM管功能与HugePages不兼容,所以在设置HugePages之前,必须先关闭Oracle的AMM管理,并设置相关的SGA和PGA的值。在数据库的初始化参数中不设置“memory_target”和“memory_max_target”这两个参数,即将其值置为0,就可以关闭AMM管理。执行:

1
2
ALTER system reset memory_target scope = spfile sid= '*';
ALTER system reset memory_max_target scope = spfile sid= '*';

并根据实际情况设置合适的SGA和PGA的大小,此处我设置为之前提到的70GB和30GB,重启数据库,使设置生效:

memory_target

sga_target

pga_target

6、修改“/etc/security/limits.conf”文件,添加或修改如下两个参数的值,值的大小保持与“kernel.shmmax”内核参数的值一致,允许数据库最大可锁定的物理内存大小有100GB。其中值是以KB为单位,必须大于系统给数据库内存,稍微小于系统总内存。例如分区有48G的内存,则可以按照42G来设置此值。因此,具体的值即为“kernel.shmmax”的值除以1024的结果,因为“kernel.shmmax”值的单位是Bytes。

1
2
* soft memlock 104857600
* hard memlock 104857600

修改完成后,切换至oracle用户下检查修改是否生效:

1
2
su - oracle
ulimit -l

ulimit

7、获取并设置HugePages的最大值。有一般性公式来计算这个值,为(sga_max_size+1G)/2M,这里的2MB即为更改后开启的单个Page的size。不过我们这里以Oracle提供的shell脚本来获取这个值。脚本在本文的最后将提供下载。关闭AMM后即可执行hugepage.sh来获取Oracle推荐的最大值。

hugepage_sh

8、将上面获取到的“vm.nr_hugepages = 35844”追加到/etc/sysctl.conf文件中。

9、shutdown数据库,然后重启服务器。重启服务器后,启动数据库,然后执行如下的操作检查hugepages是否成功开启:

1
cat /proc/meminfo | grep HugePage

hugepage_result

以上结果中“HugePages_Free”小于“HugePages_Total”,且“HugePages_Rsvd”不为“0”,即说明HugePages已经生效。同时,我们也可以到数据库的alert日志文件中查看刚刚启动的部分日志,会有使用HugePage的部分。此时查看共享内存段信息:

shared_memory_segment

下载hugepage.sh:

   声明:本文采用 BY-NC-SA 协议进行授权 | 星期九
   原创文章转载请注明:转自《开启HugePages特性(SuSE)


分享按钮