WINDOWS 32位平台 AWE内存扩展

  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区。

4AWE_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_MEMORYREG_SZ至少是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

附一:扩展内存分配

机器配置:8GB内存,16CPUdb_block_size=4096Window2003EE /3GB /PAEOracle 9206企业版

AWE_WINDOW_MEMORY使用默认值1GB的情况下

每增加500MB扩展内存,虚拟地址空间增加35MB(平均每数据块增加221字节,其中12字节为块地址,其它为变量空间管理开销)

每增加1000MB扩展内存,虚拟地址空间增加53MB(平均每数据块增加217字节,其中12字节为块地址,其它为变量空间管理开销)

每增加2000MB扩展内存,虚拟地址空间增加116MB(平均每数据块增加232字节,其中12字节为块地址,其它为变量空间管理开销)

每增加3000MB扩展内存,虚拟地址空间增加169MB(平均每数据块增加226字节,其中12字节为块地址,其它为变量空间管理开销)

每增加4000MB扩展内存,虚拟地址空间增加231MB(平均每数据块增加231字节,其中12字节为块地址,其它为变量空间管理开销)

例:假设:Oracle堆栈100M,共享池400M,数据缓存2000M,其它100M600个用户连接、每连接2M

虚拟地址空间=100+400+1000+100+600*2=2800M 则留给PGA的为200M

 

附二:sqlnet.expire_time使用例子

Sqlnet.expire_time 参数配置Oracle定期检查客户端连接的间隔,单位为分钟

使用原因某个项目由于电源不稳定经常存在断电的情况,断电之后由于Oracle不会释放死连接,导致大量的死连接占用内存,超出内存限制后新的正常连接无法建立

因为这个问题是由于Oracle无法释放死连接造成的,因此考虑设置参数sqlnet.expire_time = 10 参数来强制Oracle释放死连接。

结果在配置了sqlnet.expire_time后发现超出内存限制的错误更加频繁的出现。经过跟踪发现每当建议一个Oracle连接时,Oracle增加了两个线程和大约2M的内存空间,而正常情况下应该只增加一个线程和1M左右的内存空间。查看Oracle线程后发现中出现大量的oracore9.dll!slstscanf线程,综合前面的分析发现oracore9.dll!slstscanf线程就是oracle为了检测死连接增加的,因此注释了sqlnet.expire_time,跟踪一段时间后检查线程和内存使用恢复正常。另使用orastack oracore9.dll可以看出oracore9.dll的堆栈空间默认为1M

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4670/viewspace-310373/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4670/viewspace-310373/

你可能感兴趣的:(WINDOWS 32位平台 AWE内存扩展)