突破oracle for winK的G内存限制
众所周知在位的操作系统如winK上操作系统能管理的内存为GB(power() =G) oracle使用的总内存有G限制目前大多数信息系统都能为数据库服务器配上G物理内存甚至更多但无论你为系统配置多大的物理内存正常情况下都不能使oracle使用超过G的内存(包含SGAPGA等)从而造成系统资源浪费那么有没有什么办法能使运行在windows系统上的oracle使用超过G的内存呢?windows 提供了一种叫GT(G Tuning)的技术使得oracle使用超过G(不超过G)的内存成为可能而为了让应用程序使用更大的内存还有一种PSE的技术可以让oracle使用超过G的内存这里只对我们使用GT特性让oracle使用超过G的内存进行讨论
一 使用GT特性的基本要求
尽管可以在不超过G物理内存的系统上使用GT特性但oracle并不推荐这种做法因为这将会严重降低系统性能以我的经验来讲如果系统未安装G物理内存最好也不要使用这种方法来让oracle使用更多的内存此外在需要你的oracle使用超过G的内存时数据库服务器最好不要再运行其他的服务以减小系统的压力让oracle工作得更好
另外据MS的文档GT只能用于 Advanced Server Datacenter版本上Server 版以及 Professional 版不能使用GT特性(实际上是不是也没有必要?)
二 为什么GT能让应用程序使用超过G的内存
在正常情况下windows系统对内存的分配是这样的在内存地址x 到 xFFFFFFF之间的空间交给应用程序使用操作系统内核及其支持则使用内存地址 x 到 xFFFFFFFF之间的空间在使用GT之后操作系统将内核及其支持程序使用的内存地址空间压缩到 xC 到 xFFFFFFFF之间从而为应用程序让出来G的空间但是仅仅让出来了这G的空间还是不够的还需要指定哪一个应用程序来使用这多出来的G空间以及如何分配份额等后面将结合具体的参数设置来讨论为便于讨论我们将正常情况下应用程序可以使用的G内存(即地址在 x 到 xFFFFFFF 之间的内存)称作普通内存而将windows 让出来的G内存(地址在 x 到 xBFFFFFFF之间)称作间接内存
三 oracle使用超过G内存不超过G内存的具体设置步骤
首先应卸载实例关闭oracle服务
打开操作系统G开关
修改bootini文件在启动windows项中添加 /G 参数修改过后的bootini文件应该类似以下内容
[boot loader]
timeout=
default=multi()disk()rdisk()partition()
[operating systems]
multi()disk()rdisk()partition()=Microsoft Windows Advanced Server /G /fastdetect
注意在启动winK AdvServer的一栏里多了一个 /G 参数这个参数的作用就是让windows启动时将自己的内核及支持程序装载到内存地址 xC 到 xFFFFFFFF 之间给应用程序留出G的空间来
修改oralce 的 initora 文件
) 确定oracle的缓沖区及共享池大小假设作如下定义
db_block_size =
db_block_buffers = # 缓沖区大小为G
share_pool_size = # 使用M共享池
) 添加下列各项内容
use_indirect_data_buffers = true
# 告诉oracle可以使用间接内存(即可以使用windows让出来的G内存作为数据缓沖区)
pre_page_sga = true
# 把oracle SGA锁定到内存中不产生页面交换文件(i的参数可能是lock_sga = true)
# 对于一个有G物理内存的系统来讲可能这一个参数并不是必须的
修改注册表定义oracle的DBbuffer使用常规内存大小
在注册表 _Local_Machine中添加一个二进制值名称为AWE_WINDOW_MEMORY 值的单位为字节大小为你需要让oracle使用普通内存作为缓存的大小(不是windows让出来的G而是内存地址在x 到 xFFFFFFF 之间的内存大小)假如设为即M大小那么oracle的数据缓沖区将占用M的普通内存其余部分(G M = M)则使用间接内存
重新启动操作系统启动数据库OK你现在的 oracle 可以使用G + M内存了
四 几个补充讨论
windows系统让出来的G间接内存只能用于数据缓沖区
在GT特性测试中发现间接内存只能用于数据缓沖区而不能用于共享池也不能分配给用户作为PGA或许有其他的参数可以定义但我查到的文献中没有任何一篇讲间接内存可以用于哪些地方而在我们的测试中发现按上面的修改后间接内存只能用于数据缓沖区此结论只作为一个经验不是定论请各位大侠补充修正
注册表中 AWE_WINDOW_MEMORY 参数大小的定义
这个参数定义缓沖池使用普通内存的大小不能太小在数据块大小为K缓沖池为G(即使用个块作缓沖池)大小的情况下此参数定义为M时oracle不能启动定义为M时正常启动根据我阅读文献后对这个情况的理解数据缓沖区的每一个块的块头信息都将存放于普通内存中不能存放于间接内存中如果此参数定义过小导致缓沖区块头信息都不能存放则可导致数据库启动失败那么是不是同样大小的缓沖区数据库块越大则这个参数就可以定义得越小因而可以占用更少的普通内存呢?有待验证
在具体的应用中如何定义此参数应综合考虑最大并发连接数(专用服务器模式下)用户重用的堆栈大小排序区共享池大池等内存参数的设置情况尽可能的将数据缓沖区放到间接内存中充分利用系统的资源
间接内存的性能
据oracle的文献讲间接内存的性能(我想主要是指速度和效率吧?)不如直接内存绝不推荐在未安装有G物理内存的系统上使用GT特性我不知道如何比较间接内存与直接内存的速度和效率因而未作测试姑且信之
一点小结期望能对大家有所启发还请各位大侠补充指正
以上内容的测试环境
IBM X +G内存 + RAID 阵列
Windows Advaced Server SP + oracle 专用服务器模式