在Linux 5中为oracle配置hugepage和VLM的方法
Hugepage/Big page: 系统进程是通过虚拟地址访问内存,但是CPU必须把它转换程物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。 而在Redhat Linux中,内存都是以页的形式划分的,默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。这种增大的内存页尺寸在Linux 2.1中,称为Big page;在AS 3/4/5中,称为Hugepage。 AS 3/4有相应的内核。AS 5默认支持。 如果系统有大量的物理内存(大于8G),则无论32位的操作系统还是64位的,都应该使用Hugepage。 注意:使用Hugepage内存是共享内存,它会一直keep在内存中的,不会被交换出去,也就是说使用hurgepage的内存不能被其他的进程使用,所以,一定要合理设置这个值,避免造成浪费。对于只使用Oracle的服务器来说,把Hugepage_pool设置成SGA大小即可。
VLM(Very Large Memory ):这个是要是针对32位的操作系统,对于64位操作系统,则不需要设置VLM。在启用了vlm的情况下,32位的ORACLE可以把SGA扩展到62G。需要注意的是,VLM只对SGA中buffer cache有效,对shared pool、large pool、java pool等无效。 VLM的原理是把内存虚拟成一个文件,系统进程通过读取这个内存文件达到使用内存的目的。 如果ORACLE想要使用VLM,则必须设置参数use_indirect_data_buffers=true。如果是10g的数据库,还需要把db_cache_size转换成老版本的db_block_buffers,否则会报错。 当SGA使用VLM时,SGA对应的共享内存会分成两个部分: . 普通的系统共享内存,也就是可以从ipcs -ma看到的部分,这部分主要对应非buffer cache的SGA(large pool/shared pool/java pool/streams pool)等。 . 基于内存文件的共享内存,这部分可以通过ls -al /dev/shm查看。这部分主要对应SGA中的data buffer部分。 注意:使用VLM时,用于非buffer cache部分的内存会保留512M用于管理VLM。如如果分配了2.5G给非buffer cache使用,实际上,只有2G的实际可用内存。 当使用VLM时,以上两个部分共享内存之和等于SGA。(如果不使用VLM,则SGA大小就等于ipcs -ma显示的大小基本一致)
配置Hugepage: 因为使用hugepage部分的共享内存不能被swap,也不能被其他进程使用,如果把hugepage共享内存设置过大,会导致系统hang住。因此要配合linux的ramfs文件系统使用 既要考虑性能,又要不浪费内存,一定要把使用hugepage部分的共享内存设置一个最佳值。下面的一些参考: 1) 如果是32位操作系统,且没有用VLM,则设置 hugetlb_pool=所有运行在该服务器上的实例SGA总和。如果有ASM,则每一个ASM实例再增加200M左右 2) 如果是32位操作系统,且使用了VLM,则设置 hugetlb_pool=所有运行在该服务器上的实例除data buffer外的SGA总和。如果有ASM,则每一个ASM实例再增加200M左右 3) 如果是64位操作系统,不管是否启用VLM,都设置 hugetlb_pool=所有运行在该服务器上的实例SGA总和。如果有ASM,则每一个ASM实例再增加200M左右HUGEPAGE方法:
[ORACLE 11G] 必须关闭AMM(自动内存管理)特性才能使用hugepage 设置如下初始化参数: ALTER SYSTEM SET sga_max_size=6720M SCOPE=SPFILE; ALTER SYSTEM SET sga_target=0 SCOPE=SPFILE; ALTER SYSTEM SET PGA_AGGREGATE_TARGET=2048M SCOPE=SPFILE; ALTER SYSTEM SET memory_target=0 SCOPE=SPFILE; ALTER SYSTEM SET memory_max_target=0 SCOPE=SPFILE; 其他配置同10G [ORACLE10G] 在RHEL4/5中,是直接设置hugepage的页数。检查hugepagesize grep Hugepagesize /proc/meminfo Hugepagesize: 4096 kB 检查是否已经有分配HugePages cat /proc/meminfo|grep HugePages_Total HugePages_Total=0 配置分配hugepage的数量 nr_hugepages的计算公式:nr_hugepages>=sga(mb)/Hugepagesize(mb) echo "vm.nr_hugepages=50" >> /etc/sysctl.conf sysctl -p 再次检查hugepage的分配情况 grep HugePages_Total /proc/meminfo HugePages_Total: 6 如果这里显示的值为6,小于配置的数量50,则需要重启 reboot Broadcast message from root (pts/1) (Mon Jan 25 09:38:04 2010): The system is going down for reboot NOW! 重启之后,检查hugepage的分配情况 grep HugePages_Total /proc/meminfo HugePages_Total: 50 现在确认hugepage已经分配了50个单位(50×4096kb=200mb)
配置oracle用户的memlock 需要 vi /etc/security/limits.conf文件,加入标记为红色的两行 计算公式为:>=HugePages_Total×1024,这里设置了2倍的值,即:2×50×1024=102400 cat /etc/security/limits.conf|grep lock # - memlock - max locked-in-memory address space (KB) # - locks - max number of file locks the user can hold oracle soft memlock 102400 oracle hard memlock 102400 检查memlock情况 切换到oracle用户身份,使用ulimit -l命令检查memlock情况 su - oracle ora_test@oracle[/home/oracle]> ulimit -l 102400 启动数据库 ora_test@oracle[/home/oracle]> sqlplus / as sysdba
检查是否已经使用了hugepage > grep HugePages_Free /proc/meminfo HugePages_Free: 30 这里显示剩余的hugepage为30,小于HugePages_Total(50),证明oracle已经使用了hugepage
三、配置VLM 在RHEL3和RHEL4中,可以使用两种内存文件方式配置VLM: . shmfs/tmpfs:这个内存文件方式会发生换页,与hugepage冲突,不适用于使用hugepage的内存管理方式。其中shmfs只适用于RHEL3,tempfs适用于RHEL3和RHEL4。 . ramfs:这种方式不会发生换页,可以与hugepage搭配使用。 要配置VLM,系统内核必须支持以上三种文件系统之一,可以用以下命令判断: egrep "shm|tmpfs|ramfs" /proc/filesystems 如果结果有对应的条目输出,则表示支持该类型文件系统,如: nodev tmpfs nodev ramfs 表示内存支持tmpfs和ramfs两种内存文件系统。
下面以为一个32位的数据库配置8G大小的buffer cache为例说明如何在RHEL4/5中配置VLM(首先要保证内核支持相应的内存文件系统) 1、配置过程:
ramfs,使用前不需要去创建文件系统,直接通过mount的方式即可挂载上来用,需要的时候可以使用"mount -o remount,maxsize=..."(以kbyte为单位)这种方式来调整大小
1)挂载ramfs内存文件系统 umount /dev/shm mount -t ramfs ramfs /dev/shm chown oracle:dba /dev/shm 注意:为了重启后也生效,最好把以上几行写在/etc/rc.local里;如果oracle用户的主组不是dba,如是oinstall,则chown oracle:oinstall /dev/shm
2、修改oracle参数(以分配8G data buffer为例) *.sga_max_size=0 *.sga_target=0 use_indirect_data_buffers=true db_block_size=8192 db_block_buffers=1048576 shared_pool_size=2831155200
3、修改oracle的资源限制 在/etc/security/limits.conf中设置memlock=4194303,也就是在该文件中添加如下两行:
oracle soft memlock 4194303
oracle hard memlock 4194303
用ulimit -l验证
4194303
启动数据库: startup pfile='/opt/oracle/10gapp/dbs/initge01.ora'
当发生如下错误时要适当减少pga和shared_pool_size大小。使其总和<3.5G。(vlm管理要占用512M) ORA-27103: internal error Linux Error: 12: Cannot allocate memory
使用VLM时: 1) 无论是什么版本,不能用db_cache_size参数,必须转换成对应的db_block_buffers和db_block_size 2) data buffer部分的共享内存来自VLM,但SGA的其他部分,如shared_pool使用的共享内存来自系统的普通共享内存。 3) kernel.shmmax的设置应大于等于除data buffer以外的其他SGA部件之和 4) 不必像设置hugepage_pool那样考虑要位data buffer设置多大的共享内存,操作系统会自动生成一个与设置的data buffer一样大小的内存文件 5) 即使hugepage足够大,data buffer需要的共享内存也不会从hugepage_pool中分配,而是使用VLM内存文件扩展共享内存段 6) 即使hugepage不足,非data buffer部分的SGA需要的共享内存也不会从VLM中分配,而是使用系统其他的空闲内存扩展共享内存段
7)用于非buffer cache部分的内存会保留512M用于管理VLM。如如果分配了2.5G给非buffer cache使用,实际上,只有2G的实际可用内存。当使用VLM时,以上两个部分共享内存之和等于SGA。(如果不使用VLM,则SGA大小就等于ipcs -ma显示的大小基本一致)
最后做一个简单总结:
1、hugepage是为了提高内存的性能;VLM是为了使32位操作系统使用大内存 2、如果服务器上有大量物理内存: 如果是64位的操作系统,只需要设置hugepage即可,且可以使用db_cache_size这一新参数。 如果是32位的操作系统,需要配置hugepage和VLM,并且不能使用db_cache_size这一新参数。其中hugepage_pool设置为非buffer cache的内存总和大小。buffer cache对应的共享内存部分无需设置,OS会自动分配适当大小的内存文件作为共享内存。 |