PRE_PAGE_SGA 的玩法[转]

看了看官方文档,了解到一个以前没有注意到的细节(还是得看文档啊........),在Oracle实例启动时,只会在物理内存中首先加载SGA的个内存区的最小的大小(以Granule粒度计算)。而剩余的SGA内存只作为虚拟内存(Page File)分配,只有当进程touch到相应的page时,才会置换到物理内存中。出于最优性能的考虑我们可能需要在实例启动的时,将所有SGA都分配到物理内存中去。这时就可以通过设置PRE_PAGE_SGA参数来达到这个目的了。这就是这个参数存在的意义所在。

这个参数的默认值为FALSE,即不将全部SGA置入物理内存中。当设置为TRUE时,实例启动会将全部SGA置入物理内存中。它可以使实例启动达到它的最大性能状态,但是,启动时间也会更长(将所有的SGA都放到物理内存中去会,Oracle需要touch所有内存页)。

当参数设置为TRUE时,不仅在实例启动时,需要touch所有的SGA页,并且由于每个oracle进程都会访问SGA区,所以每当一个新进程启动时(在Dedicated Server方式中,每个会话都会启动一个Oracle进程),都会touch一遍该进程需要访问的所有页(这个页面数量,由操作系统的单位页面大小和SGA的大小来决定)。因此,每个进程的启动时间页增长了。所以,这个参数的设置也需要根据系统的应用情况来设定。而操作系统的页面的大小是由操作系统自身来指定的。

在pre_page_sga设置为false的情况下,windows的内存使用状况:


在pre_page_sga设置为true的情况下,windows的内存使用状况:

但是,要记住一点:PRE_PAGA_SGA只是在启动时将物理内存分配给SGA,但并不能保证系统在以后的运行过程不会将SGA中的某些页置换到虚拟内存中,也就是说,尽管设置了这个参数,还是可能出现Page In/Out。如果需要保障SGA不被换出,就需要由另外一个参数LOCK_SGA来控制了。这个参数默认值为FALSE,当指定为TRUE时,可以将全部SGA都锁定在物理内存中。当然,有些系统不支持内存锁定,这个参数也就无效了。

http://space.itpub.net/12361284/viewspace-133419

posted on 2009-12-23 11:05  一江水  阅读(1769)  评论(0编辑  收藏  举报