• [15445]Memory Management + Buffer Cache memo


    这一章节的重点在 buffer pool manager 

    buffer pool manager

    这一章学完我感觉我才理解了,其实我在数据库里拿到所有的数据似乎都过了一次内存。而内存有自己的算法和策略可以尽量帮我缓存我会多次访问的数据。

    访问数据的流程大概类似于 execution engine 执行了一条 query, 告诉 buffer pool 要获取的数据页,buffer pool 将调用系统函数帮助 execution engine 去查询 disk 的数据,访问 disk 上的数据字典找到对应的 page position and offset。取出该数据然后加载到 buffer pool 中。

    最后我们将指向 buffer pool 的地址指针返回给 execution engine。即可让 application layer 操作该数据了。

    从底层来看 buffer pool 就是 DBMS 划定的一块内存空间。在我进场使用的 MySQL 中,他几乎可以分配到数据库内存的80%以上以加快数据获取。

    buffer pool 可以是一个固定元素大小的 array。比如 MySQL 里面规定 page size 16kb,那么 buffer pool 中的页大小就是 16kb。array 中的元素我们称之为 frame。frame 里面可以存储的是从硬盘 page 页中拷贝出来的数据。

    ok 那么有一个套娃的问题来了,我怎么知道 page1 page2 page3 4 5 6 7 在 buffer pool 里面的哪个位置呢?因为 frame 只是存储了 page 而已。PageTable 用于解决这个问题, PageTable 可以 route pageID to buffer pool and return the point.

    同时 PageTable 可能还存储了一些别的有用的 metadata 针对每个 page。比如当前是否已经是脏页或者被引用次数或者是否需要将该 page 固定之类的,引用次数也许后续可以被用来测算是否需要将该数据 evict from buffer pool. Pin 可以帮助我们让 dbms 知道不要将这个 page evict out from buffer pool。这里还有一个叫做 latch 的能力不知道中文应该叫什么。

    latch 和 pin 还不太一样。latch 是避免多线程或者线程程序使用已经预定的 buffer pool 的这个位置。因为我已经即将要去获取 bufferpool 的某个页地址了。我要预防其他人也同时去使用这个地址。

    而 pin 却是预防我在使用过程中被人换走了这个 page。如果我在使用,我希望他一直呆在 bufferpool 中直到我使用完毕。

    这里我们谈到的 latch 有点锁的感觉,但是却不是 locks。所以课程又强调了一次 Locks 和 latches 的区别

    简单总结一点就是,Latch 在 dbms 的世界中更像是一把保护各种静态条件的锁,比较底层。 Locks 要做的世界是锁住逻辑,保护事务正常进行,如果失败还需要回滚操作。

    PageTable 和 PageDictionary 的关系就更简单一点不赘述了看 slices 记住就行。

    Buffer Pool Optimizations

    MULTIPLE BUFFER POOLS

    使用多个 buffer pool 实例有两种方案可以实现。将数据分配进不同的 buffer pool 可以显著降低锁竞争的问题。大家互相读取锁定对应数据,和占用空间,互不干扰。

    也可以更少的出现竞态条件。

    PRE-FETCHING

    预读一些记录到 buffer pool 中。比如我读了 page 1 2 3 那大概率我在执行一个 scan 操作,我们应该将 4 5 6 也提前读进来加快结果返回的速度。

    SCAN-SHARING

    如果一个查询已经扫描了整张表,然而其他查询也想做类似的事情。DBMS 将会将第二个查询的 cusor attach 到 第一个查询的 cursor 上。这里主要是解决一个数据获取效率的问题,因为和 cursor1 一起读,会直接享受到 buffer pool 里面的数据,直接从内存里面获取这些数据。等跟着 cursor2 读完了自己再回去补上没有读到的部分就可以了。这样我们可以充分重复利用 cursor1 读进 buffer pool 的数据。

    BUFFER POOL BYPASS

    有一些特殊的执行可以选择绕开 buffer pool 以避免影响其缓存策略。

    OS PAGE CACHE

    类似像 postgrelSQL 这样的数据库可以有效的利用系统页缓存。

    BUFFER REPLACEMENT POLICIES

    下面就是核心了,谈了这么多,那么该使用什么策略去决定缓存什么数据,缓存多久。又什么时候逐出数据呢?取决于我们使用什么 replacement 的算法。

    lru | lru-k | arc 都可以选择。

      

    Reference:

    https://www.youtube.com/watch?v=Y9H2HaRKOIw

    https://15445.courses.cs.cmu.edu/fall2022/slides/06-bufferpool.pdf

    https://zhuanlan.zhihu.com/p/65811829

  • 相关阅读:
    <s:iterator>各种遍历用法
    hibernate4整合spring3事务问题
    web服务器部署过程记录
    svn一次性add/delete所有文件
    svn回退版本/取消修改
    sdk接入
    论坛遇到附件上传失败问题总结(discuz)
    linux下部署monogoDB服务(以及安装php mogodb扩展)
    linux部署svn服务器
    linux下给php安装memcached及memcache扩展(转)
  • 原文地址:https://www.cnblogs.com/piperck/p/16882556.html
Copyright © 2020-2023  润新知