Chinaunix首页 | 论坛 | 博客
  • 博客访问: 339066
  • 博文数量: 94
  • 博客积分: 1500
  • 博客等级: 上尉
  • 技术积分: 1020
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-11 09:23
文章分类
文章存档

2011年(76)

2010年(18)

分类: Oracle

2011-05-20 09:17:43

Oracle内存分配与调整(下)


但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过1.7G的内存,达到2G以上甚至更多。在这里我们针对不同的平台下的具体实现方式做一个总结。

 

一.在REDHAT ADVANCED SERVER2.1上扩展SGA(1.7G以上)   

能够在一个4G以上内存的机器上将SGA1.7G的最大限制增大至2.7G,兼容Oracle8.1.79.0.19.2.0版本的数据库,但是只是允许在本地启动和关闭数据库,而且如果为PGA保留的虚拟内存太小就会导致ORA4030的错误。

具体步骤如下:

1.查看启动Oracle用户的shell的进程号PID

       ps –f 或者echo $$

2.以root用户单独打开一个进程,执行

   echo 268435456 > /proc/$PID/mapped_base

   注:Lowing the mapped_base要对服务器上所有产生Oracle的进程的shell。可以写一个脚本在.profile或者.login文件中使其每次都不必手工去做。

    一个脚本的例子,使用setuid()设置/proc//mapped_base

        int mainint argcchar * argr[ ]

        {

         pid_t,ppid;

         char buf[256];

         unsigned long mapped_base;

         int ret;

         #define NEW_MAPPED_BASE 0X10000000

         ppid=getppid();

         mapped_base=NEW_MAPPED_BASE;

         sprintf(buf,”echo %/u >/proc/%u/mapped_base”,mapped_base,ppid);

         setuid(0);

         ret=system(buf);

         if (ret==0)

           printf(“Lowering mapped_base of pid=%u to 0xX \n”,ppid,mapped_base);

         else

           printf(“unable to lower mapped_base.You might need to:\n”

                “chmod 4711 lowermap \n chown root root lowermap \n”);

         exit (-ret);

3.修改shmmax的值,以root用户执行:

   echo 3000000000 > /proc/sys/shmmax

4.重新分配SGA

   关闭所有Oracle实例

   cd $ORACLE_HOME/lib

   cp –a liberver9.a libserver9.a.org (对要修改的libserver9.a文件做个备份)

   cd $ORACLE_HOME/bin

   cp –a oracle oracle.org

   cd $ORACLE_HOME/rdbms/lib

   genksms –s 0x15000000 > ksms.s

   make –f  ins_rdbms.mk ksms.o (编译新的SGA地址)

   make –f  ins_rdbms.mk ioracle (重新链接)

   这样修改之后就可以支持到2.7G左右的SGA,从而可以提高db_cache_size或者db_block_size去提高数据库的缓冲区了。

    5.如果你已经有了一个较大的buffer cache,并且在init文件中设置了use_indirect_data_buffers=true,可以用以下的方法去提高indirect buffer window size。对于大多数的应用来说默认的512M已经足够,增大window size可以略微的提高性能,因为大的window size可以减少mapping一个indirect bufferoracle的地址空间的负载。

        设置环境变量VLM_WINDOW_SIZE在启动实例之前,这个值比如是64K的整数倍。例如:

export VLM_WINDOW_SIZE=1073741824(1G)

注:这么设置的前提是buffer cache不能太大,SGA区不能小于800M。如果在启动实例的时候报错,则有可能是需要清除共享内存段

ipcrm shm xxx 或者ipcrm sem xxx

 

二.HP TRUE64 UNIX上扩展SGA大于2G

1.  检查是否有足够的内存分配给SGA

userf –r 300 |grep –i mem

    2.配置核心参数文件/etc/sysconfigtab文件

vm

     vm-maxvas=实际物理内存

     vm-mapentires=400

     ubc-minpercent=1

     ubc-maxpercent=2

ipc

shm-max=实际物理内存或者大于SGA

shm-mni=128

shm-seg=32

proc

     max-per-proc-data-size=实际物理内存

     per-proc-data-size=实际物理内存

     max-per-proc-address-space=实际物理内存

     per-proc-address-space=实际物理内存

注:不要修改/etc/sysconfigtab文件中参数的位置。

           /sbin/sysconfig –q vm

           /sbin/sysconfig –q ipc

    /sbin/sysconfig –q proc

3.  设置环境变量

对于C shell,修改.login文件

limit datasize unlimited

limit stacksize unlimited

limit memoryuse unlimited

limit addressspace unlimited

对于Korn或者Bourn Shell,修改.login文件

ulimit –d unlimited

 ulimit –s unlimited

ulimit –m unlimited

ulimit –v unlimited

4.重新分配SGA

设置init文件中参数vlm_sga_base_address参数

例如:超过了3G,设置vlm_sga_base_address0x400000000

5SWAP区的设置

建议设置成2-3倍的物理内存

 

三.32BITSOLARIS(SPARC)上扩展SGA

针对32bit的从8.0.X9.0.X的数据库。

首先了解怎样重新分配SGA,在sun的系统上,SGA区要大于256M

sgabeg = 0xe0000000  |  256Mb   SGA

   sgabeg = 0xd0000000  |  512Mb   SGA 

   sgabeg = 0xc0000000  |  768Mb   SGA 

   sgabeg = 0xb0000000  |  1Gb     SGA 

   sgabeg = 0xa0000000  |  1.25Gb   SGA 

   sgabeg = 0x90000000  |  1.5Gb    SGA 

   sgabeg = 0x80000000  |  1.75Gb   SGA 

   sgabeg = 0x77000000  |  just less than 2Gb SGA 

   sgabeg = 0x70000000  |  2Gb      SGA 

   sgabeg = 0x60000000  |  2.25Gb    SGA 

   sgabeg = 0x50000000  |  2.5Gb     SGA 

   sgabeg = 0x40000000  |  2.75Gb    SGA 

   sgabeg = 0x30000000  |  3Gb       SGA 

   sgabeg = 0x20000000  |  3.25Gb    SGA 

   sgabeg = 0x10000000  |  3.5Gb     SGA 

           sgabeg = 0x01000000  |  16Mb less than 3.75Gb SGA 

对于9.0.X的版本:

1.  关闭当前的所有数据库

2.  cd $ORACLE_HOME/lib

cp liberver9.a libserver9.a.orig(备份这个文件)

            3cd $ORACLE_HOME/rdbms/lib

               生成ksms.s文件

               $ORACLE_HOME/bin/genksms –b new_location >ksms.s

               例如:$ORACLE_HOME/bin/genksms –b 0x60000000 >ksms.s(增至2.25Gb)

4.生成ksms.o文件

make –f ins_rdbms.mk ksms.o

            5.归档ksms.o文件至libserver9.a文件

               ar -r $ORACLE_HOME/lib/libserver9.a ksms.o

            6.重新链接

               make –f ins_rdbms.mk ioracle

对于8.1.X的版本

1.关闭当前的所有数据库

2cd $ORACLE_HOME/lib

cp liberver8.a libserver8.a.orig(备份这个文件)

            3cd $ORACLE_HOME/rdbms/lib

               生成ksms.s文件

               $ORACLE_HOME/bin/genksms –b new_location >ksms.s

               例如:$ORACLE_HOME/bin/genksms –b 0x60000000 >ksms.s(增至2.25Gb)

4.生成ksms.o文件

make –f ins_rdbms.mk ksms.o

            5.归档ksms.o文件至libserver9.a文件

               ar -r $ORACLE_HOME/lib/libserver9.a ksms.o

            6.重新链接

               make –f ins_rdbms.mk ioracle

    7.如果使用的是sun4u老版本的solaris结构,则在第3步中将new_location的值减少一个0

           例如:0x80000000改成0x8000000

对于8.0.X的版本

1.  关闭当前的所有数据库

2.  cd $ORACLE_HOME/rdbms/lib

3.  修改ksms.s文件

$ORACLE_HOME/bin/genksms –b new_location >ksms.s

4.  备份ins_rdbms.mk文件

cp ins_rdbms.mk ins_rdbms.mk.ksms

5.  修改ins_rdbms.mk文件

ksms.s $(RDBMSLIB)ksms.s:

        $(GENKSMS) > ksms.s

改为ksms.s $(RDBMSLIB)ksms.s:

        $(GENKSMS) > ksms.s.default_sgabeg

6.  生成ksms.o对象

make –f ins_rdbms.mk ksms.o

7.  重新连接

make –f ins_rdbms.mk ioracle

    8.如果使用的是sun4u老版本的solaris结构,则在第3步中将new_location的值减少一个0

       例如:0x80000000改成0x8000000

对于7.3.37.3.4版本

1.关闭当前的所有数据库

2cd $ORACLE_HOME/rdbms/lib

3.修改ksms.s文件

   sgabeg=0xe0000000改成sgabeg=0x80000000

4.备份env_rdbms.mk文件

   cp env.rdbms.mk env_rdbms.mk.ksms

            5.修改env_rdbms.mk文件

           修改 $(ORACLE_HOME)/bin/genksms > $(KSMSS) 

             $(ORACLE_HOME)/bin/genksms > $(KSMSS).sga 

        6.生成ksms.o对象

           make –f ins_rdbms.mk ksms.o

        7.修改ins_rdbms.mk文件

               –rm –f ksms.s ksms.o

               改为 –rm –f ksms.o

        8.重新链接

           make –f  ins_rdbms.mk ioracle

9.如果使用的是sun4u老版本的solaris结构,则在第3步中将new_location的值减少一个0

       例如:0x80000000改成0x8000000

对于7.3.2.X版本

1.关闭当前的所有数据库

2cd $ORACLE_HOME/rdbms/lib

3.修改ksms.s文件

   sgabeg=0xe0000000改成sgabeg=0x80000000

4.备份env_rdbms.mk文件

   cp env.rdbms.mk env_rdbms.mk.ksms

            5.修改env_rdbms.mk文件

           修改 $(ORACLE_HOME)/bin/genksms > $(KSMSS) 

             $(ORACLE_HOME)/bin/genksms > $(KSMSS).sga 

        6.生成ksms.o对象

           make –f ins_rdbms.mk ksms.o

        7.重新链接

           make –f ins_rdbms.mk ioracle

8.如果使用的是sun4u老版本的solaris结构,则在第3步中将new_location的值减少一个0

       例如:0x80000000改成0x8000000

对于7.2.3或者更低的版本

1.关闭当前的所有数据库

2cd $ORACLE_HOME/rdbms/lib

3.修改ksms.s文件

   sgabeg=0xe0000000改成sgabeg=0x80000000

4.编辑oracle.mk文件,注释掉以下两行:

           ksms.s: $(ORACLE_HOME)/bin/genksms 

                 $(ORACLE_HOME)/bin/genksms > ksms.s 

            5.重新链接

               make –f oracle.mk ioracle

            6.生成ksms.o对象

           make –f oracle.mk ksms.o

7.如果使用的是sun4u老版本的solaris结构,则在第3步中将new_location的值减少一个0

       例如:0x80000000改成0x8000000

 

HP-UNIX 11.0上扩展SGA

HP上的最大SGA的大小:

HP-UX 9:0.75GB

HP-UX10.0&oracle版本低于7.3.X1GB

HP-UX10.X以上&oracle7.3.X以上:1.75GB

HP-UX11.0(64bits)&oracle64bitsMillions of Tera

HP-UX11.0(64bits)&memory windows&32bit8.0.5以上

32位的oracle32位或者64位的HP-UX11.0上最大的SGA大约是1.7GB,对于systemwide共享内存段的最大值也是限制在1.75GB,除非使用memory windowsoracle8.0.5以上的版本才能够扩展SGA

例如:32bitoracle32bitHP-UX11.0上,oracle的一个实例使用了1.25GB的共享内存,那么剩下的实例能使用的共享内存就只有1.75GB-1.25GB=0.5GB了。

Memory windows32位或者64位的HP-UX11.0上的,它允许独立的进程去使用更多的物理内存。每个oracle的实例运行属于自己的“window”,有1G的共享内存的保留,加上0.75GB的对于系统上其他所有进程的共享。

例如:机器上有五个oracle的实例,则可以有5*1GB0.75GB=5.75GB的共享内存使用。

        Memory windows一般适用于64bitHP-UX并且内存大于2GB或者多个32bit的实例且总共的SGA>1.75GB。系统要求是HP-UX11.0 32bit或者64bitOracle8.0.5with pactch for bug785609Oracle8.0.6或者8.1.5 with HP-UX patches PHKL_17091PHCO_16795,或者8.1.5以上版本。

扩展SGA的具体步骤如下:

1.首先必须要安装memory windows并且启用它。

2Memory windows的数量可以通过调整HP-UX的核心参数max_mem_window来修改。

3.启用后,会存在有/etc/services.window文件,这个文件映射oracle实例的IDwindow keys,映射服务名到端口号。

4.修改/etc/serveices.window文件,对于每一个实例,在文件的第一列上写上ORACLE_SID,第二列写上windows key

例如有两个实例orcl1orcl2/etc/services.window文件内容可能如下:

orcl1   3

orcl2   4

5Window key不能设置为0,因为0是系统保留给“global windows”的,如果设置为0,则Memory window就不起作用了。

 

 

五.IBM AIX RS6000上扩展SGA

               因为Oracle9iIBM AIX平台上就没有32bit的版本了,而64bit的版本基本上SGA是没有限制的,所以下面主要针对一些老版本的Oracle简单说明一下。

AIX4.3.3 (32bit)

 8i企业版8.1.6.0.0(32bit)        SGA=>2.5GB

 8i企业版8.1.7.0.0(32bit)        SGA=>2.5GB

AIX4.3.3(64bit)

 8i企业版8.1.6.0.0(64bit)        SGA=>2.0GB (bug1284437)

 8i企业版8.1.7.0.0(32bit)        SGA=>2.5G

 8i企业版8.1.7.0.0(64bit)        SGA=>4GB以上

如果需要2.5GBSGAOracle7上并且不是OracleOPS方式,执行以下步骤:

1cd $ORACLE_HOME/lib

genksms –s 0x30000000 >ksms.imp

2cd $ORACLE_HOME/rdbms/lib

重新链接oracle

                 make –f ins_rdbms.mk ioracle

 

六.WINDOWS平台上扩展SGA

针对32bitWindowsWindows2000上不能利用超过4G的内存,一般是2G的内存保留给进程,2G内存保留给核心的。在Windows2000 Advanced Server上可以分配3G给进程,1G留给核心的。

1.  如果机器的内存在4G以下,可以使用Physical Address ExtensionsPAE)或者是Address Windowing ExtensionsAWE)进行扩展,如果机器内存大于4GB就只能使用AWE进行扩展了。

AWE支持以下的Windows操作系统:

Windows 2000 Datacenter Server

Windows 2000 Advanced Server

Windows 2003 Datacenter Edition32bit

Windows 2003 Enterprise Edition32bit

AWE不支持以下的Windows操作系统:

Windows 2000 ServerStandard

Windows2000 Professional

Windows XP Home Edition

Windows XP Professional

Windows 2003 Standard Edition

Windows 2003 Web Edition

AWE支持的Oracle数据库的版本:

Oracle 8.1.6.X

Oracle 8.1.7.X

Oracle 9.2.X

AWE不支持Oracle9.0.1.X

在标准版的Oracle9.2.0.1上,如果你设置了use_indirect_data_buffers=true,启动就会报错:

ORA-439-feature not enabled:very large memory.

这个是标准版的Oracle9.2.0.1的一个bug(#2520796),在Oracle9.2.0.2中解决了。

2.  在操作系统上启动AWE

AWE在操作系统上可以通过在boot.ini文件中加/PAE切换启用。

例如:

multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /PAE

也可以同时使用/PAE/3G在同一台机器上,例如:

multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /3GB /PAE

但是同时使用内存最到能够支持到16G,如果用使用16G以上的内存,则必须选择其中的一种使用了。

3. Oracle上启用AWE

首先要在启动的参数文件中设置参数

USE_INDIRECT_DATA_BUFFERS=TRUE

如果设置了这个参数,对于Oracle9.2.0的版本则不能再使用DB_CACHE_SIZE参数了,只能使用DB_BLOCK_BUFFERS参数。

扩展的内存只能增加到BUFFER CACHE中去使用,因此只能增大DB_BLOCK_BUFFERS这个参数去扩展SGA区。

4. AWE_WINDOW_MEMORY实现故障解决

Oracle8.1.7版本以下启动数据库的时候不用设置AWE_WINDOW_MEMORY的最小值,而在Oracle9.2.0的版本中则强制要设置AWE_WINDOW_MEMORY的最小值,这个最小值在Oracle8.1.7中通过DB_BLOCK_LRU_LATCHES参数设定,在Oracle9.2.0中则通过_DB_BLOCK_LRU_LATCHES隐含参数设定,Oracle9.2.0AWE_WINDOW_MEMORY的最小值由以下的公式计算:

MIN(AWE_WINDOW_MEMORY)=(4096 * DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES)/8

_DB_BLOCK_LRU_LATCHES = (Max buffer pools * SETS_PER_POOL)

Max Buffer Pools是个常量,等于8SETS_PER_POOL是个变量,它的大小由是否启用VLM(即设定USE_INDIRECT_DATA_BUFFERS=TRUE参数)决定:

SETS_PER_POOL = 2* CPU_COUNT (启用 VLM)

SETS_PER_POOL= CPU Count /2  (不启用VLM)

例如:

CPU's = 16

             DB_BLOCK_SIZE = 8192

             Total RAM = 16 GB 

             SETS_PER_POOL = 2 * CPU_COUNT = 32

             _DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256              MIN(AWE_WINDOW_MEMORY)=(4096*DB_BLOCK_SIZE*_DB_BLOCK_LRU_LATCHES)/8 =( 4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB

            这样在Windows的注册表中的HKLM\Software\Oracle\Homex下的AWE_WINDOW_MEMORY值至少是1024M,否则就会提示错误:

            ORA-27102 out of memory 

            OSD-00034 Message 34 not found;  Product=RDBMS;facility =SOSD 

            O/S Error: (OS 8) Not enough storage is available to process this command

 

 

 

 

 

 

 

阅读(2625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~