ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【翻译】内存结构 (一)

【翻译】内存结构 (一)

原创 Linux操作系统 作者:yellowlee 时间:2009-08-14 13:04:32 0 删除 编辑

读文档容易,翻译难。先试试手。未完待续。

oracle 9i concepts
part III The oralce instance
7.memory architecture
本节讨论oracle实例的内存结构,主要包括:
.oracle 内存结构介绍
.系统全局区(sga)概述
.程序全局区(pga)概述
.专用和共享服务器
.软件代码区

.oracle 内存结构介绍
 oracle的内存用来存储以下信息:
 .程序代码
 .连接会话信息,包括当前不活动的连接
 .程序执行期间所需的信息(例如:当前被查询取出的行的状态)
 .共享信息和oracle进程间通信信息(例如:锁)
 .缓冲数据(例如:数据块,重做日志条目)
 oracle基础内存结构包括:
 .系统全局区,由所有服务和后台进程共有:
  - 数据库缓存
  - 重做日志缓存
  - 共享池
  - 大池(如果已经设置的话)
 下图显示了这些存储结构之间的关系:
 
 软件代码区是另外一个基础内存结构,在7-22讨论
 参考:
  ."系统全局区(sga)概览" 7-3
  ."程序全局区(pga)概览" 7-17
 
 系统全局区(sga)概览
  系统全局区是包括oracle数据库实例的数据和控制信息的一组共享的内存结构。如果多个用户
  当前连接同一个实例,那么实例的sga中的数据被所有用户共享。因此,sga有时候也被叫做共享
  全局区。
  
  sga和oracle进程构成一个oracle实例。启动一个实例时,oracle自动为sga分配内存,当关闭实例
  时,操作系统回收内存。每个实例都拥有独自的sga。
  
  sga是可读可写的。所有连接的用户可以读实例sga中的信息,并且一些进程可以写sga。
  sga包含以下的数据结构:
   .数据库缓存
   .重做日志缓存
   .共享池
   .java池
   .大池(可选)
   .数据字典缓存
   .其他信息
  sga中包含了部分数据库和实例的状态信息,后台进程需要访问,这部分叫做fixed sga。
  这部分没有用户数据存储。sga也包括了进程间通信信息,例如锁信息。
  
  如果系统使用共享服务结构,那么请求和相应队列和pga的一些内容都在sga中。
  参考:
   ."oracle实例简介" 5.2
   ."程序全局区概览" 7.17
   ."调度请求和相应队列" 8.16
  
 动态sga
  动态sga结构下,缓存、共享池、大池和私有进程内存的大小可以在不关闭实例的情况下修改。
  
  动态sga允许oracle运行时设置虚拟内存使用的上限。oracle能够控制启动实例允许实例使用
  的内存不超过最大值(SGA_MAX_SIZE)。如果SGA_MAX_SIZE在初始化参数文件中的值比所有组件
  在初始时指定的或默认的小,那么初始化参数文件将被忽略。
  
  大多数的系统性能选项中,sga应该占用真实内存。如果不这样,并且虚拟内存被用来部分存储,
  那么整个数据库系统性能将会迅速下降,因为部分sga由操作系统分页(磁盘读写)。sga的专用共享区
  的数量对性能也有影响。
  
  sga的大小由几个初始化参数决定,主要:
  ---------------------------------------------------------------------
  参数        描述
  DB_CACHE_SIZE    标准缓存块的大小
  LOG_BUFFER     重做日志缓存的大小
  SHARD_POOL_SIZE   用来存放共享的sql和plsql的区的大小
  LARGE_POOL_SIZE   大池的大小,默认是0
  ---------------------------------------------------------------------
  实例的sga内存分配显示在用企业管理器或者sql plus启动实例时。你也可以使用sql plus的show
  命令查看当前实例的sga。
  
  Dynamic SGA Granules
  使用动态sga,最小的分配单元叫做Granules。buffer cache,share pool,java pool和large pool
  分配和释放sga空间都是以Granules为单元的。(。。)所有有关granule的信息都存储在相应的granule
  实体中。oracle维护每个granule实体状态和类型。
  
  granule的大小由总的sga大小决定。在大多数平台上,当总的sga大小小于128m时,一个granule的大小是4m。
  超过的话,就是16m。同时对平台也有一些依赖性,比如32位的windowNT,当sga超过128m的时候,一个granule是8m。
  
  sga当前granule的大小可以在视图 v$sga_dynamic_components查看。所有的sga中动态组成部分使用相同的granule大小。
  
  -----------------------------------------------------------
  注意:如果你指定了一个granule大小的非倍数值,那么oracle将会取
  趋近的一个值。例如:如果granule大小是4m,你制定SB_CACHE_SIZE
  为10m,那么实际上会按照12m来分配。
  -----------------------------------------------------------
  
  
  
 数据库缓存(Database Buffer Cache)
  数据库缓存是sga的组成部分,存储了从数据文件读取的数据块的拷贝。所有当前连接实例的用户进程
  共享的访问数据库缓存。
  数据库缓存和共享sql缓存是按照逻辑分割成许多集。这种多集的组织减少了多处理器的争用问题。 
  数据库缓存组织
  缓冲区由两个列表组织:写列表和最近最少使用列表(LRU)。写列表中有脏缓冲,里面包含了被修改过
  但还没有写回磁盘的数据。LRU列表包括空闲缓存,正在使用的缓存,未写回的脏缓存。空闲缓存中不包含
  有用的数据,可以使用。pinned buffers是正在被访问的缓存。
  
  当一个oracle进程访问缓存时候,进程将缓存放入最近最久未使用列表的末尾。(。。)
  (原文:
   When an Oracle process accesses a buffer, the process moves the buffer to the most
   recently used (MRU) end of the LRUlist. Asmore buffers are continuallymoved to
   the MRU end of the LRU list, dirty buffers age toward the LRU end of the LRU list.
  )
  
  oracle用户进程第一次请求某个特定的数据时,将在数据库缓存中查找数据。如果进程在缓存中已经查找到(cache命中),
  将直接从内存中读取数据。如果未找到(未命中),则访问数据前,从磁盘中的数据文件中拷贝数据库到缓存中。
  访问数据时,cache命中比未命中速度更快。
  
  在读取数据库到缓存中之前,进程必须先找到一个空闲缓冲区。进程查找LRU列表,从最近最少使用列表的末尾开始。
  进程搜索直到找到一块空闲的缓冲或者有起始限制的缓冲(该句翻译有问题)。
  
  如果用户进程通过查找LRU列表,找到一个脏缓存,则将这个缓存移动到写列表(write list),并继续搜索。
  当进程搜素到一个空闲缓存,则读取从磁盘读取数据块到该缓存中,并把改缓存放到MRU 。(MRU end of the LRU list)
  
  如果oracle用户进程查询在开始限制的混村内没有找到一块空闲缓存,进程将停止搜索LRU列表并通知DBW0后台进程
  写脏缓存到磁盘。
   参考:"Database Writer Process(DBWn)" 8-8,更多的关于DBWn进程的信息。
   
  LRU算法和全表扫描
  当用户进程进行全表扫描时,它读取表的块到缓存,并且将其放入LRU列表的末尾(而不是MRU的末尾)。
  这是因为全表扫描通常需要的只有简捷,所以数据库必须被快速的换出而在缓存中留下最常用的块。
  (This is because a fully scanned table usually is needed only briefly, so the blocks
   should be moved out quickly to leave more frequently used blocks in the cache.)
  
  (。。)
  
  缓存(buffer cache)大小
  oracle在一个数据库中支持多个块大小值。系统表空间使用默认的块大小值。通过修改配置文件的
  DB_BLOCK_SIZE参数,可以设置标准的块大小。允许的值范围是2k至32k。
  同时可以有选择的设置两个额外的缓冲池:keep和recycle,设置DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。
  这三个参数各自相互独立。
   参考:"Multiple Buffer Pools"
  非标准的块大小设置的参数如下:
   DB_2K_CACHE_SIZE 
   DB_4K_CACHE_SIZE
   DB_8K_CACHE_SIZE
   DB_16K_CACHE_SIZE
   DB_32K_CACHE_SIZE
  每个参数设置了缓存的相应的块大小。
   ----------------------------------------------------------------------------
   注意:块的最大值与平台相关,一些值可能在某些平台上不被允许。
   ----------------------------------------------------------------------------
  块和缓冲大小设置举例:
   DB_BLOCK_SIZE=4096
   DB_CACHE_SIZE=1024M
   DB_2K_CACHE_SIZE=256M
   DB_8K_CACHE_SIZE=512M
  实例中,DB_BLOCK_SIZE设置标准块大小为4k。标准块的缓冲区大小为1024m。同时,2k和8k的缓存设置
  分别设置为256m和512m。
   ----------------------------------------------------------------------------
   注意:参数DB_nK_CACHE_SIZE不能被用来设置标准块大小。也就是说,如果DB_BLOCK_SIZE
   是nK,那么不能设置db_nk_block_size。标准块大小总是由DB_CACHE_SIZE决定。
   ----------------------------------------------------------------------------
  cache大小是有限制的,所以并不是磁盘上所有数据都能匹配cache。当cache满时,频繁的cache未命中
  会导致oracle将cache中的脏数据写回磁盘,以腾出空间给新的数据。(如果一个buffe不是脏的,那么
  在新数据库读入buffer之前它不会被写回磁盘。)
  频繁访问已经写回磁盘的数据将会增加cache丢失(cache命中率降低)。
  
  cache的大小影响了请求数据结果的cache命中。如果cache较大,那么通常会存放更多需要的数据。
  增大cache的大小增加了请求数据结果的命中的百分比。
  可以在不用关闭数据库的前提下,改变运行中实例的cache大小。可以使用ALTER SYSTEM命令来操作。
  更多的信息,查看"Control of the SGA's Use of Memory" 7-16
  
  使用固定视图(fixed view:数据字典视图,存在与system表空间)v$buffer_pool来跟踪不同的cache
  和重设大小的操作。
   参考:Oracle9i Database Performance Tuning Guide and Reference for information about tuning
      the buffer cache.
  
  Multiple Buffer Pools

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

下一篇: 【转】缓存算法
请登录后发表评论 登录
全部评论

注册时间:2008-12-27

  • 博文量
    316
  • 访问量
    656021