IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    buffer cache 的内部结构

    老A的自留地,欢迎加微信交流,微信号zhoul777发表于 2020-03-18 14:21:25
    love 0
    BUFFER CACHE作为数据块的缓冲区,不是一块简单的内存区域。在这一块内存区域上,Oracle设计了很多LATCH来保护BUFFER CACHE的结构不受并发性访问的破坏,当LATCH数量不够用或并发访问模式不兼容时,将会引起LATCH的争用,这就是我们经常看到的LATCH FREE等待事件。
    从BUFFER CACHE中读取数据块一般需要花费100ns左右,假设每次只读取一个数据块,也就是每秒可以读取10 000 000个数据块。而从磁盘读取数据块一般需要花费10ms左右(包括寻址定位时间和传输时间),也就是说每秒只能读取100个数据块。从这个角度来讲,数据块从内存中读取的效率要比从磁盘中读取高100 000倍,但并不是说数据块从BUFFER CACHE中读取一定比从磁盘中读取好,即BUFFER CACHE的命中率并不是越高越好。BUFFER CACHE作为Oracle 数据块的缓冲区,不同的系统类型和业务模块对其命中率的敏感程度会有所不同。比如OLTP系统并发高、事务小、响应快、SQL执行时读取的数据块数量较少,因此,在此系统上比较高的BUFFER CACHE命中率不仅能加快数据块的读取时间,而且能有效缓解存储的I/O压力。而OLAP系统并发低,事务大,SQL执行时读取的数据块数量较多, 所以在这类系统中,BUFFER CACHE命中率的高低却不是特别重要,而且在此类系统中,将所有的数据块都存储在BUFFER CACHE中也不太现实。
    客户端发起读取业务数据的需求,数据库在接受到这个请求之后,首先会在BUFFER CACHE中查看所需的数据块是否存在,如果存在,则从BUFFER CACHE中读取数据块内容返回给业务程序。如果不存在,则由服务器进程从数据文件中将数据块读至BUFFER CACHE中,然后再返回给业务程序。从以上简单的流程中可以引申出以下几个优化点:
    当数据块在BUFFER CACHE中不存在时,业务程序只能从数据文件中物理地读取数据块(PHYSICAL READS),因此会消耗比较多的I/O资源。当存储I/O压力比较大时,可以增加BUFFER CACHE,加大数据块驻留在BUFFER CACHE中的概率,从而缓减系统I/O压力。
    业务程序读取BUFFER CACHE中的数据块之前需要获得一系列LATCH,所以在某些场景下,数据块不经过BUFFER CACHE直接返回给应用程序效率可能更高一些。
    同一时刻,Oracle只允许一个进程修改数据块。如果大量的进程并发读取或修改BUFFER CACHE中相同的数据块,那么势必会引起争用。
    在进一步探讨这几个优化点之前,首先需要大致了解一下BUFFER CACHE的内存结构。
    BUFFER CACHE的内存结构相当复杂,图8-1为BUFFER CACHE的内存结构图(摘自Richmond Shee, Kirtikumar Deshpande , K Gopalakrishnan的大作《Oracle Wait Interface: A Practical Guide to Performance Diagnostics & Tuning》)。

    了解BUFFER CACHE上一些比较重要的知识点:
    BUFFER HEADER
    HASH CHAIN
    HASH BUCKET
    HASH LATCH
    WORKING SET
    BUFFER HEADER指的数据块缓冲块头,BUFFER HEADER的地址位指向真正的数据块缓冲区,如图8-1中的虚线所示。当服务器进程将数据块读取至BUFFER CACHE时,Oracle会根据该数据块的DBA值进行HASH运算,然后根据计算出的HASH值挂载到某一个HASH BUCKET中。同样,Oracle需要在BUFFER CACHE中定位某个数据块是否存在时,也会根据该数据块的HASH值在指定的HASH BUCKET中寻找。不同的数据块经过HASH运算之后可能挂载到同一个HASH BUCKET中(也就是说这些数据块的HASH值相同)。Oracle将同一个HASH BUCKET的不同数据块用一条HASH CHAIN串联起来。由于同一个HASH BUCKET上可能有多个数据块,为了防止HASH CHAIN受到进程并发性访问的破坏,所以Oracle设计了专门的LATCH用于保护HASH CHAIN,该LATCH的名字称之为CACHE BUFFERS CHAINS LATCH。另外,由于BUFFER CACHE是一块公共内存区域,为了防止BUFFER CACHE内存不足,需要按照算法(如TOUCH COUNT算法)定期将数据块通过DBWR进程写至数据文件中,释放内存空间来给其他数据块使用。在BUFFER CACHE中,数据块的替换工作主要由WORKING SET来管理。为了便于快速定位数据库性能原因,Oracle在WORKING SET上设计了很多等待事件,这些等待事件将在接下来的小节中一一展开。

    已有 0 人发表留言,猛击->>这里<<-参与讨论


    ITeye推荐
    • —软件人才免语言低担保 赴美带薪读研!—





沪ICP备19023445号-2号
友情链接