`
itspace
  • 浏览: 981306 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

buffer cache 的内部结构

 
阅读更多
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上设计了很多等待事件,这些等待事件将在接下来的小节中一一展开。
分享到:
评论

相关推荐

    深入Buffer Cache 原理

    为了实现高效的缓冲区管理,Buffer Cache主要包括三个关键的数据结构: 1. **HashBucket & HashChain List** - **作用**:用于快速定位数据块。 - **原理**:通过内部哈希算法,将Buffer Cache中的所有缓冲区分发...

    cache系统介绍

    Stream Buffer是一种用于数据预读的硬件机制,其设计目的是自动识别内存访问模式并预先加载数据到Cache中。 最后,作者在文档中表达了对Cache Memory领域探索的种种思考,并号召更多的人加入到完善和丰富有关Cache ...

    ORACLE系统内部结构

    System Global Area (SGA) 是所有服务器进程共享的一块内存区域,包括数据缓冲区高速缓存(Buffer Cache)、重做日志缓冲区(Redo Log Buffer)、数据字典缓存(Data Dictionary Cache)等。Program Global Area ...

    浅谈cache memory 王齐.pdf

    其中L1 Cache位于CPU核心内部,速度最快,容量最小;L2 Cache速度较慢,容量较大;L3 Cache通常位于多个核心共享,以提高核心间的数据共享效率。 缓存的一致性和一致性问题主要涉及到多核处理器中多个缓存之间的...

    arm 处理器 cache 机制文档

    现代处理器内部可能包含多层Cache结构,如ARM处理器的多级缓存系统,这种层次结构的设计可以进一步减少访问延迟并提高吞吐量。上层Cache(如L1)比下层(如L2或L3)拥有更低的延迟但容量较小,下层Cache则容量较大但...

    简单缓存Cache介绍

    最后,对于.NET框架的学习,我们应该深入理解其内部机制,不仅仅局限于理论知识,还要探索实际的系统细节。通过了解和利用.NET框架提供的各种工具和技术,如缓存,我们可以更好地优化代码,提升应用程序的性能。在...

    A14_CPU Cache支持1

    首先,实验目的是让学生熟悉Cache的内部构造,包括Cache的组相连方式、替换策略(如LRU或伪随机)以及硬件初始化。实验设备需要Xilinx Vivado开发环境和MIPS交叉编译工具,以及龙芯体系结构的教学实验箱。 实验任务...

    hbase bucket cache

    #### Bucket Cache 的内部结构 - **IO Engine**:负责实际的数据读写操作。 - **Accessor**:用于获取缓存中的数据块。 - **Cache Block Writer Thread**:将数据块写入到 IO Engine 中。 - **Bucket Allocator**:...

    cache design

    在多级缓存(Multi-Level Cache)体系中,通常有L1、L2、L3等多层缓存,L1是最快但容量较小的缓存,它位于CPU内部,而L2、L3缓存容量更大,速度相对较慢,可能位于CPU内部也可能位于CPU外部。 缓存的工作方式通常包括...

    对于oracle11g 各种进程进行详解,进程与内存结构的关系,SGA的讲解

    Oracle数据库是企业级数据库管理系统,其内部架构包括实例(Instance)和数据库文件。实例作为用户与数据库交互的桥梁,由内存结构和一组后台进程构成。本文将深入解析Oracle 11g中的进程与内存结构,特别是系统全局...

    oracle basic

    1. **L/O Buffer Cache**:这是Oracle缓存数据的地方,通过减少对磁盘的直接读取,提高性能。当读操作发生时,Oracle会尝试在Buffer Cache中查找所需的数据。如果命中率低,意味着更多的磁盘I/O,可能表明性能问题。...

    Oracle服务进程如何处理用户进程的请求.doc

    - **数据已存在于DB Buffer Cache**:如果请求的数据已经在DB Buffer Cache中,并且是有效的,那么服务器进程可以直接获取这些数据,并更新LRU(Least Recently Used)列表中的访问计数。 - **数据不在DB Buffer Cache...

    ARM926EJ-S处理器中Cache一致性问题的探讨.pdf

    处理器内部的系统协处理器CP15控制着Cache、WriteBuffer和MMU的使用,是实现Cache一致性的重要部件。 文章通过详细介绍ARM926EJ-S处理器内Cache的工作原理和基于该处理器的典型SoC结构,深入探讨了Cache一致性问题...

    Oracle v$bh 视图 详细讲解

    在Oracle数据库中,Buffer Cache是内存结构的一部分,用于存储数据块和索引块的副本,以减少磁盘I/O操作。当数据从磁盘读取到内存时,它们会被放入Buffer Cache,后续的相同数据请求可以直接从内存中获取,显著提升...

    通10g系统管理笔记1__Oracle体系结构

    SGA 主要包括共享池(Shared Pool)、数据高速缓存(Database Buffer Cache)和重做日志缓冲区(Redo Log Buffer)三部分。 共享池(Shared Pool) 共享池用于存放最近执行的 SQL 语句和数据字典信息,尺寸由初始...

    老相Oracle DBA学习笔记

    Oracle数据库管理员(DBA)学习笔记详细记录了Oracle数据库中SQL语句执行的过程,包括用户连接、服务器进程分配、PGA空间、SQL解析、执行计划缓存、shared pool、buffer cache、逻辑IO和物理IO、重做日志等关键知识...

    mysql read_buffer_size 设置多少合适

    8. `innodb_additional_mem_pool_size`:20MB过小,提升至128MB,用于InnoDB内部数据结构。 9. `join_buffer_size`:这个参数很重要,尤其涉及JOIN操作,如果未设置,应添加并设为8MB。 请注意,这些优化建议是基于...

    tuning-latch-contention_cbc.pdf

    文档首先介绍了Latch的基本概念:在Oracle内存结构中,Latch是一种内部机制,用于协调对共享资源的访问。与Locks(也称为Enqueues)不同,Latches不提供队列机制。通常情况下,Latches持有时间很短,而Locks持有时间...

Global site tag (gtag.js) - Google Analytics