使用裸设备,还是使用文件系统?

  描述 pros cons
裸设备

顺序读磁盘快比随机要快10-100倍,DB比OS更懂磁盘负载,因此很多DB是直接管理数据块如何存放的。

DB对裸设备的管理,比文件系统成熟得早,加上性能高,以及可忽略文件系统之间的差异,写裸设备也是推荐的。

要求DBA给DB划分整个磁盘;

同时裸设备接口随OS不同而不同,因此阻碍了商业化DB使用此方式;

最后裸设备不支持raid、san、nas。随着时间迁移,裸设备的优势已经不明显了。

文件系统

创建一个大文件,通过文件偏移量管理数据。
POSIX规范提供Mmap/msync接口,这样就可支持可调节的DB页面大小,因为这对接口可将页面大小设置为与文件系统页面不同的值。如何选择页面大小,可见论文“5-minite rule”。

空磁盘上创建大文件,则文件内偏移量与物理偏移量大致一致;

因此性能上类似于裸设备了。

论文第六章举例讲了RAID的麻烦之处

不能使用文件系统缓存

如果DB使用文件系统的缓存机制,那么会带来重排序写问题、静默写延迟和性能问题。

  1. 事务落盘的时序无法保证;
  2. 无法保证Write Ahead Log原则
  3. 文件系统自带read-ahead预读和write-behind后写特性,这与DB的访问模式完全不符合:文件系统以来文件内物理偏移来做读写决策,而DB IO机制需要支持按照逻辑行为。
    • 例1: DB能预测查询流的逻辑顺序,但是这些查询数据在物理上并不是连续的,OS的读写AP对预读I没有助益,DB需要结合“扫描B+树叶子”、“查询计划里的数据访问算法”、“查询计划里的future access pattern”信息,查询线程才能实现逻辑预读。
    • 例2:DB刷日志缓存的时候,需要综合考虑锁状态和IO吞吐,这些信息智能靠DB自己获得,OS文件系统无法获得。

4. 性能上还有一个经典问题:双缓冲与内存拷贝造成的CPU占用率过高。

上面讨论过,为了保证正确,DB必须自己实现缓存,如果再使用OS的缓存,那么即带来内存的浪费,又带来拷贝内存的时间浪费。DB的瓶颈一般出现在内存上,之所以很多人不认为内存是瓶颈,而认为I/O是瓶颈,是因为很多商业DB产品厂商算好了内存与磁盘的比例这样正好能适应buffer pool;也算好了磁臂间磁盘交换IO的速率正好能适应所有操作系统的处理器,所以这种产品的I/O是瓶颈。

综上所述,数据库应该自己管理缓存。当代OS给数据库等程序提供钩子(如mmap/msync/madvise调用)以便规避double-buffering、保证直接刷盘、以及提供可定制策略。

为了快速访问数据库页面,所有DB都实现了一个巨大的共享缓冲池

帧:缓冲池是一个帧数组,每个帧对应一块DB block 大小的内存区域,这样一方面读写磁盘不需要翻译,另一方面也避免了内存碎片和压缩。
页面表:这个表每个元素对应一个帧,包含磁盘地址、脏标、引线数pin count和换页算法锁需要的信息。
缓冲池换页算法:这个算法的研究绕了一些弯路。早期关系型数据库领域有很多研究换页策略,主要是因对嵌套循环连接nested-loop join。嵌套循环连接的循环访问模式是一遍遍扫描比缓冲池还大的堆文件,按照OS换页策略如LRU/CLOCK对索引重用间隔的悲观策略,应对nested-loop join效果是很差的。当时人们想了很多种算法,有的策略是针对不同页面类型使用不同换页算法,例如按照Reiter域分离计划,B+树根节点和堆文件中页面的替换方式就不一样;有的甚至涉及到通过查询计划来动态修改换页策略。但是今天,大多数系统使用改进的LRU算法。

Anatomy of a Database System学习笔记 - 存储管理的更多相关文章

  1. Anatomy of a Database System学习笔记 - 概论、并发控制

    <Anatomy of a Database System>这篇发表于87年.一共48页的论文据说是DBA入门必看,但是找了全网没有找到中文翻译.这篇文章对关系型数据库确实有提纲挈领的作用 ...

  2. Anatomy of a Database System学习笔记 - 公共模块、结语

    公共模块 1. 使用基于上下文的内存分配器进行内存分配 除了教材里常提到的buffer pool,数据库还会为其他任务分配大量内存,例如,Selinger-style查询优化需要动态的规划查询:has ...

  3. Anatomy of a Database System学习笔记 - 查询

    查询解析 解析会生成一个查询的内部展示.格式检查包含在解析过程中. 每次解析一个SELECT,步骤如下:1. 从FROM里找到表名,转换成schema.tablename.这一步需要调用目录管理器ca ...

  4. Anatomy of a Database System学习笔记 - 事务:并发控制与恢复

    这一章看起来是讲存储引擎的.作者抱怨数据库被黑为“monolithic”.不可拆分为可复用的组件:但是实际上除了事务存储引擎管理模块,其他模块入解析器.重写引擎.优化器.执行器.访问方式都是代码相对独 ...

  5. 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用

    目录 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用 16.1 LVM的工作原理 16.1.1 LVM常用术语 16.1.2 LVM优点 16.2 创建LVM的基本步骤 16.2 ...

  6. A.Kaw矩阵代数初步学习笔记 5. System of Equations

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  7. system generator学习笔记【02】

    作者:桂. 时间:2018-05-20  23:28:04 链接:https://www.cnblogs.com/xingshansi/p/9059668.html 前言 继续学习sysgen.接触s ...

  8. System类学习笔记

    最近在学习源码的过程中发现:很多深层次的代码都用到了一个类System类,所以决定对System类一探究竟 本文先对System类进行了剖析,然后对System类做了总结 一.首先对该类的中的所有字段 ...

  9. jz2440存储管理实验【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 简介:先来简单的说明一下这次的实验,看看下图,我们的程序通过烧录器下载到nandflash当中去,之后在启动的时 ...

随机推荐

  1. mysql执行sql脚本文件

    mysql执行sql脚本文件 方法一:使用cmd命令执行(windows下,unix或Linux在的其控制台下) [MySQL的bin目录]\mysql –u用户名 –p密码 –D数据库<[sq ...

  2. 在Ubuntu下安装lrzsz

    目录 自动安装 手动安装 下载 解压 安装 创建连接 在Ubuntu 14.04x64下安装lrzsz 自动安装 在终端中,输入命令 sudo apt-get install lrzsz 由于一些原因 ...

  3. 渗透测试学习 四、 HTML基础

    HTML是一种解释型语言,解释给浏览器解析执行显示给用户浏览,是一种静态,无交互的 超文本标记语言(Hyper Text Markup Language),标准通用标记语言下的一个应用.HTML 不是 ...

  4. 顺序栈代码实现&&stack库

    #include<iostream> using namespace std; ; typedef int Elemtype; struct SqStack { Elemtype *bas ...

  5. cordova本地浮动框提示插件使用:cordova-plugin-x-toast

    1. 添加插件:cordova plugin add cordova-plugin-x-toast 2. 调用方法(浮动提示插件,弹出本地浮动提示框): $cordovaToast.show(mess ...

  6. sql注入-输入’or 1=1#

    比如:在用户名输入框中输入:’or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:     select * from users where username='' or 1=1#' a ...

  7. MUD 多人地下城

    发售年份 1980 平台 多平台 开发商 Roy Trubshaw, Richard Battle 类型 冒险 https://www.youtube.com/watch?v=338WE8O2-KA

  8. python 将本地目录暴露为http服务

    python3 nohup python3 -m http.server 8080 &

  9. JSON和JSONP,浅析JSONP解决AJAX跨域问题

    说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服 ...

  10. 通过excel创建表

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...