全部博文(191)
分类: Oracle
2010-03-06 23:52:20
Buffer cache
Buffer cache的管理
Oracle对于buffer cache的管理,是通过两个重要的链表实现的,写链表和最少最近使用链表(least recently userd LRU),写链表所指向的是所有脏数据块缓存,而LRU链表所指向的是所有空闲块、正在被使用的块、以及还没有来得及写入写链表的脏数据块。LRU两端分别称最近使用端MRU和最近最少使用端LRU。
Buffer cache的数据块的访问
当一个Oracle进程第一次访问一个缓存时候,这个进程会将这个块缓存移到LRU链表的MRU端。当越来越多的缓冲块被移动到MRU端,那些已经过时的脏缓冲区(即数据改动被写入数据文件的中,次时缓冲和数据文件的数据已经一致)则被移动这LRU链表的LRU端。
当一个Oracle用户进程第一次访问一个数据块时候,他会先查找buffer cache 中是否存在个数据块的拷贝。如果有,则命中(hit ratio),直接读取数据;如果在buffer cache 中没有找到,则未命中(hit missing)。他就先要从数据库文件中读取数据块到buffer cache中,然后才能访问该数据块。
命中次数与进程读取数据文件块的比例是衡量数据库性能的重要指标。一个良好的数据库系统的命中率在95%左右。
上面提到,如果未命中(missed)的话,则Oracle服务器进程需要读数据块到缓存中去,这个时候,Oracle进程需要从LRU链表中找出空闲的缓存块,他会从LRU链表的LRU端开始查找,直到找出可用数据块或寻找限制数量。在查找过程中,如果进程找到了一个脏的块缓存。它将这个脏块移动到写入链表中,然后继续查找。当它找到一个空闲块后,就从磁盘读取数据块到这个空闲块中。并将这个块从LRU端移动到MRU端。
Free buffer request 请求分配的free buffer
Free buffer inspected 请求下个buffer ,就是被跳过去的buffer的数量
如果Oracle用户进程达到查找块数量的限制后还没有找到空闲块缓存,它就停止查找LRU链表,并且触发DBWR后台进程去写入脏块到磁盘文件。
17/93
Buffer cache 重要视图
V$db_cache_advice
调整DB_CACHE_SIZE的大小,已提高其性能提供很大的参考作用。
注意三个字段:
Size_for_estimate 预测cache大小
Estd_physical_read_factor 物理读取算法
Estd_physical_reads 物理读取次数
V$buffer_pool
该视图显示所有缓存池的的信息。
V$buffer_pool_statistics
该视图查看当前数据库buffer cache的命中率
Select 1-(physical_reads)/(consistent_gets+db_block_gets)
From v$buffer_pool_statistics
V$bh
该视图记录了缓冲区内所有的数据块对象,一条记录对应一个数据块。
Buffer cache调优工具:
V$buffer_pool_statistics
V$buffer_pool
V$db_cache_advice
V$sysstat
V$sesstat
V$system_wait
V$session_wait
V$bh
V$cache
Buffer cache调优对象:
SGA
LRU list
Checkpoint queue
Buffer cache (default)
Keep buffer cache
Recycle buffer cache
Buffer cache 调优重要的事件:
1. free buffer inspected 找到空闲块的消耗
2. free buffer waits 找不到空闲块而等待
3. buffer busy waits 多个进程在使用该块而等待
Shared pool
V$librarycache
该视图对共享池性能调优很有帮助。
其中该视图的字段PIN的命中率或未命中率是系统调优的重要依据。
V$library_cache_memory
该视图显示了各个命名空间中库缓存内存对象的内存分配情况。
PGA
Pga是一块包含一个服务器进程的数据和控制信息的的内存区域。它是Oracle在一个服务进程启动时创建的,是非共享的。一个oracle进程拥有一个pga内存区。一个pga也只能被拥有它的那个服务器进程访问,只有这个进程中的oracl代码才能读写它。因此pga中的结构是不需要latch保护的。
PGA的组成:固定pga和可变pga
可变pga包括:私有SQL区域、游标和SQL区、会话内存。
Pga的重要参数设置:
对于该参数的大小的设置,建议如下:
OLTP系统:Pga_aggregate_target=(物理内存大小*80%)*20%
DSS或OLAP系统:Pga_aggregate_target=(物理内存大小*80%)*50%
Workarea_size_policy
Auto 自动(推荐)
Manual 手动
PGA重要视图:
V$pgastat
V$pga_target_advice
该视图是PGA内存区域大小的建议视图。(推荐)