CMU 15-445 -- Buffer Pool - 03

news2024/12/28 5:14:24

CMU 15-445 -- Buffer Pool - 03

  • 引言
  • Buffer Pools
    • Buffer Pool Manager
      • Lock 和 Latch 的区别
      • PAGE TABLE 和 PAGE DIRECTORY
      • Multiple Buffer Pools
      • Prefetching
      • Scan Sharing
      • Buffer Pool Bypass
      • OS Page Cache
    • Buffer Replacement Policies
      • LRU
      • Clock
      • LRU 与 Clock 的问题
      • LRU-K
      • Localization
      • Priority Hints
      • Dirty Pages
    • Allocation Policies
      • Other Memory Pools
  • 小结


引言

本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录,附加个人拙见,同样借助CMU 15-445课程内容来完成MIT 6.830 lab内容。


Buffer Pools

上节中提到,DBMS 的磁盘管理模块主要解决两个问题:

  1. 如何使用磁盘文件来表示数据库的数据(元数据、索引、数据表等)

  2. (本节)如何管理数据在内存与磁盘之间的移动

本节将讨论第二个问题。管理数据在内存与磁盘之间的移动又分为两个方面:空间控制(Spatial Control)和时间控制(Temporal Control)

Spatial Control

  • 空间控制策略通过决定将 pages 写到磁盘的哪个位置,使得常常一起使用的 pages 能离得更近,从而提高 I/O 效率。

Temporal Control

  • 时间控制策略通过决定何时将 pages 读入内存,写回磁盘,使得读写的次数最小,从而提高 I/O 效率。

整个 big picture 如下图所示:

在这里插入图片描述

本节的提纲如下:

  • Buffer Pool Manager
  • Replacement Policies
  • Allocation Policies
  • Other Memory Pools

Buffer Pool Manager

DBMS 启动时会从 OS 申请一片内存区域,即 Buffer Pool,并将这块区域划分成大小相同的 pages,为了与 disk pages 区别,通常称为 frames,当 DBMS 请求一个 disk page 时,它首先需要被复制到 Buffer Pool 的一个 frame 中,如下图所示:

在这里插入图片描述
同时 DBMS 会维护一个 page table,负责记录每个 page 在内存中的位置,以及是否被写过(Dirty Flag),是否被引用或引用计数(Pin/Reference Counter)等元信息,如下图所示:

在这里插入图片描述
当 page table 中的某 page 被引用时,会记录引用数(pin/reference),表示该 page 正在被使用,空间不够时不应该被移除;当被请求的 page 不在 page table 中时,DBMS 会先申请一个 latch(lock 的别名),表示该 entry 被占用,然后从 disk 中读取相关 page 到 buffer pool,释放 latch。以上两种过程如下图所示:

在这里插入图片描述


Lock 和 Latch 的区别

Locks:

  • Locks通常是在DBMS的事务管理系统层面实现的,用于保护事务对数据库对象(如表、行、页)的独占访问。
  • 在事务期间被持有
  • 需要支持回滚加锁期间改变的内容
  • 可以实现多种粒度的锁,例如行级锁、页级锁、表级锁等,以提供更细粒度的并发控制
  • Locks的作用范围可以跨越多个事务,可以实现在事务之间的共享和排他访问控制

Latches:

  • Latch通常是在DBMS的存储管理系统层面实现的,用于保护内部数据结构(如缓冲池、索引结构)的一致性。
  • 在对内部数据结构操作期间持有
  • 不需要支持回滚特性
  • 简单的互斥锁实现
  • Latch的作用范围通常限于单个线程或单个事务,用于保护数据结构在内部操作期间的一致性

总体而言,Locks和Latch在数据库管理系统中扮演着不同的角色。Locks用于提供更细粒度的并发控制和隔离,用于事务对数据库对象的独占访问。而Latch则用于保护内部数据结构的一致性,提供基本的互斥访问。


PAGE TABLE 和 PAGE DIRECTORY

page directory:

  • 维护 page id 和 page 在磁盘上位置的映射关系
  • 映射关系的改变必须记录到磁盘,这样DBMS才能再重启时不丢失映射关系。

page table:

  • 维护 page id 和 page 在 buffer pool 中 frame 的映射关系
  • 这是一个存在于内存中的数据结构,无需同步到磁盘上。

Multiple Buffer Pools

为了减少并发控制的开销以及利用数据访问的局部性,DBMS 可能在不同维度上维护多个 Buffer Pools:

  • 多个 Buffer Pools 实例,相同的 page hash 到相同的实例上
  • 每个 Database 分配一个 Buffer Pool
  • 每种 Page 类型一个 Buffer Pool

Prefetching

DBMS 可以通过查询计划来预取 pages,如:

  • Sequential Scans
  • Index Scans

在这里插入图片描述

在这里插入图片描述


Scan Sharing

Scan Sharing 技术主要用在多个查询存在数据共用的情况。当两个查询 A, B 先后发生,B 发现自己有一部分数据与 A 共用,于是先共用 A 的 cursor,等 A 扫完后,再扫描自己还需要的其它数据。

在这里插入图片描述


Buffer Pool Bypass

当遇到大数据量的 Sequential Scan 时,如果将所需 pages 顺序存入 Buffer Pool,将造成后者的污染,因为这些 pages 通常只使用一次,而它们的进入将导致一些可能在未来更需要的 pages 被移除。因此一些 DBMS 做了相应的优化,在这种查询出现时,为它单独分配一块局部内存,将其对 Buffer Pool 的影响隔离。


OS Page Cache

大部分 disk operations 都是通过系统调用完成,通常系统会维护自身的数据缓存,这会导致一份数据分别在操作系统和 DMBS 中被缓存两次。大多数 DBMS 都会使用 (O_DIRECT) 来告诉 OS 不要缓存这些数据,除了 Postgres。


Buffer Replacement Policies

当 Buffer Pool 空间不足时,读入新的 pages 必然需要 DBMS 从已经在 Buffer Pool 中的 pages 选择一些移除,这个选择就由 Buffer Replacement Policies 负责完成。它的主要目标是:

  • Correctness:操作过程中要保证脏数据同步到 disk
  • Accuracy:尽量选择不常用的 pages 移除
  • Speed:决策要迅速,每次移除 pages 都需要申请 latch,使用太久将使得并发度下降
  • Meta-data overhead:决策所使用的元信息占用的量不能太大

LRU

维护每个 page 上一次被访问的时间戳,每次移除时间戳最早的 page。


Clock

Clock 是 LRU 的近似策略,它不需要每个 page 上次被访问的时间戳,而是为每个 page 保存一个 reference bit :
在这里插入图片描述

  • 每当 page 被访问时,reference bit 设置为 1
    在这里插入图片描述
  • 每当需要移除 page 时,从上次访问的位置开始,按顺序轮询每个 page 的 reference bit,若该 bit 为 1,则重置为 0;若该 bit 为 0,则移除该 page
    在这里插入图片描述

LRU 与 Clock 的问题

二者都容易被 sequential flooding 现象影响,从而导致最近被访问的 page 实际上却是最不可能需要的 page。为了解决这个问题,又提出了 LRU-K 策略。

sequential flooding:

  • 一个执行顺序扫描的SQL查询,并且会顺序读取每一页(会顺序读取很多页)
  • 这些批量顺序读取出来的页会污染buffer pool ,因为这些page大多只读取一次,然后再也不会被访问了

LRU-K

LRU-K 保存每个 page 的最后 K 次访问时间戳,利用这些时间戳来估计它们下次被访问的时间,通常 K 取 1 就能获得很好的效果。


Localization

DBMS 针对每个查询做出移除 pages 的限制,使得这种影响被控制在较小的范围内,类似 API 的 rate limit。

PostgreSQL(通常称为Postgres)维护着一个小的环形缓冲区,该缓冲区是每个查询私有的:

  • 在PostgreSQL中,当执行一个查询时,通常涉及多个步骤,如解析、规划和执行查询。在执行阶段,PostgreSQL为每个查询分配一个小的环形缓冲区,也称为私有临时缓冲区。
  • 这个私有的环形缓冲区是特定于查询的临时存储区域,用于保存查询执行过程中的中间结果、临时数据或其他所需的信息。它作为查询处理过程的工作区,允许高效地访问内存,而不会干扰其他并发查询。
  • 这个私有环形缓冲区的存在,确保了每个查询都有自己的私有工作区,避免了不同查询之间的干扰或冲突。这种机制有助于提高查询的性能和并发处理能力,并确保查询的正确执行。

Priority Hints

有时候 DBMS 知道每个 page 在查询执行过程中的上下文信息,因此它可以根据这些信息判断一个 page 是否重要。


Dirty Pages

移除一个 dirty page 的成本要高于移除一般 page,因为前者需要写 disk,后者可以直接 drop,因此 DBMS 在移除 page 的时候也需要考虑到这部分的影响。除了直接在 Replacement Policies 中考虑,有的 DBMS 使用 Background Writing 的方式来处理。它们定期扫描 page table,发现 dirty page 就写入 disk,在 Replacement 发生时就无需考虑脏数据带来的问题。


Allocation Policies

Allocation Policies 指 DBMS 如何为不同的查询分配内存,可以分为 Global Policies 和 Local Policies。前者指同时考虑所有查询来分配内存,后者指为单个查询分配内存时不考虑其它查询的情况。


Other Memory Pools

除了存储 tuples 和 indexes,DBMS 还需要 Memory Pools 来存储其它数据,如:

  • Sorting + Join Buffers
  • Query Caches
  • Maintenance Buffers
  • Log Buffers
  • Dictionary Caches

Maintenance Buffers(维护缓冲区)是PostgreSQL中的一个概念,用于处理后台写入和维护操作:

  • 在PostgreSQL中,当进行后台写入操作(如自动保存点、检查点和日志刷新)或执行维护操作(如自动清理、VACUUM和索引维护)时,会使用维护缓冲区。

  • 维护缓冲区是一部分内存空间,用于临时存储在后台写入和维护过程中需要的数据和元数据。它用于缓冲和管理这些操作中产生的数据页的更改,以便在适当的时机写入磁盘。

  • 通过使用维护缓冲区,PostgreSQL可以将后台写入和维护操作与前台查询和更新操作隔离开来,以避免对数据库性能的直接影响。维护缓冲区的使用可以提高后台写入和维护操作的效率,并确保数据持久性和一致性。

  • 维护缓冲区的大小可以通过配置参数进行调整,以平衡后台操作的性能需求和系统资源的利用。不同的工作负载和系统需求可能需要不同大小的维护缓冲区设置。


小结

数据库管理系统(DBMS)可以比操作系统更好地管理内存资源。

利用查询计划的语义可以做出更好的决策,包括页面驱逐、内存分配和预取操作。

本节内容对应教材的PDF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何优雅的将 Docker 镜像从 1.43G 瘦身到 22.4MB

Docker 镜像的大小对于系统的 CI/CD 等都有影响,尤其是云部署场景。我们在生产实践中都会做瘦身的操作,尽最大的可能使用 Size 小的镜像完成功能。下文是一个简单的 ReactJS 程序上线的瘦身体验,希望可以帮助大家找到镜像瘦身的方向和灵感。 …

Helm之深入浅出Kubernetes包管理工具使用

Chart 使用 作者:行癫(盗版必究) 一:Chart 模板使用 1.创建chart ​ templates目录包括了模板文件;当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates目录中;然后收集模板的结果并发送给Kubernetes ​ values.yaml 文件也导入到了模板;这个文件包含了c…

北京大学2016计算机学科夏令营上机考试

目录 A:分段函数【水题】 B:单词翻转【暴力不水】 C:反反复复【字符串】 D:文件结构“图”【图】 E:Exchange Rates【这不是我能做的】 F:Dungeon Master【没看懂题目什么意思】 G:重建二叉树【树】 A:分段函数【水题】 #include<iostream> using namespace std;…

如何自学入门网络安全/黑客?【建议收藏】

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…

零基础学会Python编程——不同的运算:算术、关系与逻辑(1)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 学习目标 一. 运算 1.算术运算 2.加法运算 3.减法运算 4.乘法运算 5.除法…

Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解

文章目录 0. 前言1. 基本原理1.1 基于频道(Channel)的发布/订阅1.2 基于模式(Pattern)的发布/订阅 2. Redis 发布订阅实际应用2.1 Redis Sentinel2.1 SpringBoot Redis发布/订阅 3. Redis从入门到精通系列文章 0. 前言 发布订阅模式&#xff08;Publish-Subscribe Pattern&…

小而强大:通过容器化应用实现前端微服务

微服务架构是一种软件架构模式&#xff0c;用于构建复杂应用程序。它将一个大型的单体应用程序拆分为一组更小、更独立的服务&#xff0c;每个服务都运行在自己的进程中&#xff0c;并通过轻量级的通信机制进行交互。每个服务都专注于解决特定的业务功能或服务&#xff0c;并且…

Distractor-aware Siamese Networks for Visual Object Tracking(DaSiamRPN)

Distractor-aware Siamese Networks for Visual Object Tracking&#xff08;DaSiamRPN&#xff0c;ECCV2018&#xff09; 该论文针对以下三个问题&#xff0c;分别进行了改进&#xff1a; 常见的Siam类跟踪方法只能区分目标和无语义信息的背景&#xff08;即简单背景&#x…

MacBook(M1)上安装Ubuntu虚拟机

Mac&#xff08;M1&#xff09;上安装Ubuntu虚拟机 0.下载资料汇总 VMware Fusionhttps://www.vmware.com/products/fusion/fusion-evaluation.htmlubuntu-desktop-arm64.isohttps://cdimage.ubuntu.com/jammy/daily-live/current/ 1.安装VMware Mac版本的VMware叫 VMware …

SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks

SiamRPN: Evolution of Siamese Visual Tracking with Very Deep Networks&#xff08;CVPR2019&#xff09; 为什么2018年提出的SiamRPN网络还在用老式的AlexNet作为Siamese Network的特征提取网络呢&#xff1f;其实SiamRPN也尝试过用ResNet替代AlexNet&#xff0c;但发现效…

gitlab使用教程

一&#xff1a;账号管理 1、管理员添加 gitlab的用户分为管理员用户和普通用户&#xff0c;在界面上管理员会多了如下图所示的管理员区域&#xff0c;管理员拥有用户管理的功能&#xff0c;普通用户没有此功能。 通过管理员区域的用户-添加用户&#xff0c;根据提示填写必要…

JVM02-JVM即时编译器JIT

1-类编译加载执行过程 先了解下Java从编译到运行的整个过程 类编译&#xff1a;在编写好代码之后&#xff0c;我们需要将 .java文件编译成 .class文件&#xff0c;才能在虚拟机上正常运行代码。文件的编译通常是由JDK中自带的Javac工具完成&#xff0c;一个简单的 .java文件&a…

使用Flutter开发俄罗斯方块小游戏

一、本篇文章主要是来讲解下俄罗斯方块游戏的开发思路&#xff08;当然可能不是最好的思路&#xff09;&#xff0c;博客文章顶部有代码&#xff08;仅供参考&#xff09; 二、效果图 视频效果图地址 三、UI页面思路拆解 游戏的主界面两部分组成&#xff0c;上面为15*10的格…

Proxyman 替换js

在真机排查问题时&#xff0c;js不能格式化&#xff0c;导致没法看问题出在那一行&#xff0c;此时可以用这个方法替换js。 方法&#xff1a; 安装proxyman后&#xff0c;以iOS设备为例&#xff0c;菜单-证书-在iOS上安装证书 电脑、真机连接同一个网络&#xff0c;配置代理&…

SparkCore

Spark是一种快速、通用、可扩展的大数据分析引擎 Spark的特点 Speed&#xff1a;快速高效 性能比Hadoop MapReduce快100倍。即便是不将数据cache到内存中&#xff0c;其速度也是MapReduce10 倍以上。 Ease of Use&#xff1a;简洁易用 Spark支持 Java、Scala、Python和R等…

ctfshow—红包4

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 from secrets import randbelow from nationalsecret import p, r, k, flagg 2 y pow(g, k, p)def gogogo():print("Another chance:")t int(input(t ))c randbelow(p)print("Here is my…

关于anaconda的python虚拟环境

1.查看anaconda的虚拟环境 在cmd中输入 conda env list //查看conda中的虚拟环境和 activate 环境名称 //激活环境 pip list //查看该环境的包 python // 可以查看该环境python的版本 deactivate //退出环境2.使用anaconda创建新的…

Java Web HTMLCSS(2)23.6.30

2&#xff0c;CSS 2.1 概述 CSS 是一门语言&#xff0c;用于控制网页表现。我们之前介绍过W3C标准。W3C标准规定了网页是由以下组成&#xff1a; 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript CSS也有一个专业的名字&#xff1a;Cascading Style Sh…

如何在 macOS 上同时使用 Flutter2 和 Flutter3 进行 ios 开发

如何在 macOS 上同时使用 Flutter2 和 Flutter3 进行 ios 开发 前言 猫哥主打系统环境是: macos flutter 3.7.12 ruby 3.2.2 cocoapods 1.12.1 xcode 14.3.1 这套配置运行最新的项目没问题&#xff0c;但是最近需要维护 flutter 2.10.5 这种老项目&#xff0c;虽然用了 fvm 进…