buffer cache 内存管理物理结构纯干货

buffer cache 里有三种数据结构来管理内存空间

1 hash chain 2 LRU LIST 3 DIRTY LIST

hash chain 是为快速定位buffer cache中块的结构,主要通过hash链表实现。每个hash桶对应一个hash链。链上每个header指向一个数据块,
 一个hash latch管理多个hash桶。
 有对应隐含参数管理latch个数,和hash桶的个数。大概一个latch管理32个hash桶。latch就是桶上的锁,如果两个进程都已只读方式读取链上
 的两个块,那么latch可以对只读共享。如果一个进程读一个块,另一个进程要修改桶对应链上的另一个块,就是独占方式访问,于是要等前一个
 进程释放latch才能用独占方式访问这个块。后一个进程在等待前一个进程释放latch时,发生等待事件latch:cache buffers chains。
 对这个等待事件解决方法,可能遇到大量逻辑读很多的sql,要逻辑读,就要访问一个块,就可能获取latch,引发大量latch:cache buffers chains
争用,于是根据逻辑读排序找出逻辑读最多的sql,调整其执行计划。
等待事件具体诊断可参考  latch:cache buffers chains的优化思路 http://blog.itpub.net/24742969/viewspace-1692853/

LRU list在缓存初始加载时,所有buffer cache 块都放到LRU list管理,从磁盘读取数据到内存前,先查看LRU list找到一个空块,以便存放磁盘
 读到内存的数据。读LIST的时候如果有块时脏块,就把这样的块放到dirty LIST。扫描LRU list超过40%还没找到空块,停止扫描写dirty LIST脏数据
 到磁盘,并给出free buffer wait等待事件,如果经常发生这个事件就要考虑加大Buffer Cache了。还有如果dirty LIST超过25%也会写脏数据
 到磁盘。

通俗的说就是先通过hash chain找到内存块读数据,如果读取的数据没在内存块,就要从磁盘读数据到内存,读入内存时哪个块是空块,或要换出内存被
 写入磁盘数据由LRU决定。如果块上的数据是脏数据就用dirtyLIST 管理,脏数据写出后,该块仍由LRU管理
LRU LIST 和 DIRTY LIST 统一称为working set 他们也需要latch保护,因为他们是共享的用于管理内存的块,需要latch防止数据的破坏

时间: 2024-11-13 06:40:49

buffer cache 内存管理物理结构纯干货的相关文章

oracle Buffer Cache的管理机制

1.LRU链表结构概述 在前面,我们已经知道了Oracle是如何在hash chain中搜索要找的数据块所对应的buffer header的过程,我们也知道如果在hash chain上没有找到所要的buffer header时,Oracle会发出I/O调用,到磁盘上的数据文件中获取数据块,并将该数据块的内容复制一份到buffer cache中的内存数据块里.这个时候,假如buffer cache是空的,比较好办,直接拿一个空的内存数据块来用即可.但是如果buffer cache中的内存数据块全都

Oracle内存结构详解(二) Oracle管理Buffer Cache

Buffer Cache是SGA区中专门用于存放从数据文件中读取的的数据块拷贝的区域.Oracle进程如果发现需要访问的数据块已经在buffer cache中,就直接读写内存中的相应区域,而无需读取数据文件,从而大大提高性能(内存的读取效率是磁盘读取效率的14000倍).Buffer cache对于所有oracle进程都是共享的,即能被所有oracle进程访问. 和Shared Pool一样,buffer cache被分为多个集合,这样能够大大降低多CPU系统中的争用问题. 1.Buffer c

buffer cache实验3:lru和lruw链表

1.Buffer cache中的LRU链表概念: oracle在hash chain中未搜索到所需要的buffer时,ORACEL 服务进程会发出I/O调用,到磁盘的数据文件中读取相应数据块--除了直接路径读外,此时会将数据块的内容拷贝到buffer cache 内存中--同时会构造一个buffer header. 在将数据块拷贝到buffer cache中时,假如buffer cache是空的,直接拿一个空的内存数据块来用即可. 但是如果buffer cache中的内存数据块全都被用掉了,没有

MySQL · 引擎特性 · InnoDB 文件系统之IO系统和内存管理

综述 在前一篇我们介绍了InnoDB文件系统的物理结构,本篇我们继续介绍InnoDB文件系统的IO接口和内存管理. 为了管理磁盘文件的读写操作,InnoDB设计了一套文件IO操作接口,提供了同步IO和异步IO两种文件读写方式.针对异步IO,支持两种方式:一种是Native AIO,这需要你在编译阶段加上LibAio的Dev包,另外一种是simulated aio模式,InnoDB早期实现了一套系统来模拟异步IO,但现在Native Aio已经很成熟了,并且Simulated Aio本身存在性能问

Linux中buffer/cache,swap,虚拟内存和page ++

1.Buffer 和 cache Free 命令相对于top 提供了更简洁的查看系统内存使用情况: [apptest@vs022 ~]$ free -m               --以MB为单位                     total         used       free     shared    buffers     cachedMem:            32109      30133      1975          0        472    

buffer cache 深度解析+

本文内容整理自网络:     本文首先详细介绍了oracle中buffer cache的概念以及所包含的内存结构.然后结合各个后台进程(包括DBWRn.CKPT.LGWR等)深入介绍了oracle对于buffer cache的管理机制,并详细解释了oracle为什么会采用现在的管理机制,是为了解决什么问题.比如为何会引入touch次数.为何会引入增量检查点等等.最后全面介绍了有关buffer cache监控以及调优的实用方法. 1. buffer cache的概念   用最简单的语言来描述ora

buffer cache实验1:内存结构图解

1.为什么要使用buffer cache??? buffer cache就是一块含有许多数据块的内存区域,这些数据块主要都是数据文件里的数据块内容的拷贝. 从buffer cache中读取一个数据块一般需要100ns左右,从一般的存储硬盘中读取一个数据块需要10ms:所以大概算一下,从内存中读取数据块比从硬盘中快近十万倍. 故oracle在读取数据块时,先在buffer cache中查找,如存在,则读取--逻辑读:如果数据块不存在,则发生物理读,从物理文件中将数据读入buffer cache(不

Buffer cache和page cache有何区别

Page cache和buffer cache到底有什么区别呢?很多时候我们不知道系统在做IO操作的时候到底是走了page cache还是buffer cache?其实,buffer cache和page  cache是Linux中两个比较简单的概念,在此对其总结说明. Page cache是vfs文件系统层的cache,例如 对于一个ext3文件系统而言,每个文件都会有一棵radix树管理文件的缓存页,这些被管理的缓存页被称之为page cache.所以,page cache是针对文件系统而言

buffer cache实验7:buffer busy waits-完成

1.buffer busy waits产生原理分析: 一次逻辑读时CBC latch锁及Buffer pin锁的获取和释放过程如下: 1.加Latch X 2.进入hash chain,在相应的BH上加Buffer pin S (0-->1) 3.释放Latch X 4.进行逻辑读--也就是通过BH中的buffer adderss找到数据块在内存中真实位置  ---假如读了1MS 5.加Latch X 6.释放Buffer pin S (1-->0)  0:没锁  1:共享锁 -SELECT