MySQL buffer pool里的三种链表和三种page

mysql buffer pool里的三种链表和三种page


buffer pool是通过三种list来管理的
1) free list
2) lru list
3) flush list

 

buffer pool中的最小单位是page,在innodb中定义三种page
1) free page :此page未被使用,此种类型page位于free链表中
2) clean page:此page被使用,对应数据文件中的一个页面,但是页面没有被修改,此种类型page位于lru链表中
3) dirty page:此page被使用,对应数据文件中的一个页面,但是页面被修改过,此种类型page位于lru链表和flush链表中

 

buffer pool flush list的工作原理

 

dirty page如何存在flush链表中?


在flush list中存在的page只能是dirty page,flush list中存在的dirty page是按着oldest_modification时间排序的,当页面访问/修改都被封装为一个mini-transaction,mini-transactin提交的时候,则mini-transaction涉及到的页面就进入了flush链表中,oldest_modification的值越大,说明page越晚被修改过,就排在flush链表的头部,oldest_modification的值越小,说明page越早被修改过,就排在flush链表的尾部,这样当flush链表做flush动作时,从flush链表的尾部开始scan,写出一定数量的dirty page到磁盘,推荐checkpoint点,使恢复的时间尽可能的短。除了flush链表本身的flush操作可以把dirty page从flush链表删除外,lru链表的flush操作也会让dirty page从flush链表删除。


buffer pool lru list的工作原理

总的来说每当一个新页面被读取buffer pool之后,MySQL数据库InnoDB存储引擎都会判断当前buffer pool的free page是否足够,若不足,则尝试flush LRU链表。

在MySQL 5.6.2之前,用户线程在读入一个page (buf_read_page)、新建一个page(buf_page_create)、预读page(buf_read_ahead_linear) 等等操作时,都会在操作成功之后,调用buf_flush_free_margin函数,判断当前buffer pool是否有足够的free pages,若free pages不足,则进行LRU list flush,释放出足够的free pages,保证系统的可用性。


通过判断当前buf pool中需要flush多少dirty pages,才能够预留出足够的可被替换的页面(free pages or clean pages in LRU list tail)。

 

说明:
可用pages由以下两部分组成:
1. buf pool free list中的所有page,都是可以立即使用的。
2. buf pool LRU list尾部(5+2*BUF_READ_AHEAD_AREA)所有的clean pages。
其中:BUF_READ_AHEAD_AREA为64,是一个linear read ahead读取的大小,1 extent

 

由于buf_flush_free_margin函数是在用户线程中调用执行的,若需要flush LRU list,那么对于用户的响应时间有较大的影响。因此,在MySQL 5.6.2之后,InnoDB专门开辟了一个page cleaner线程,处理dirty page的flush动作(包括LRU list flush与flush list flush),降低page flush对于用户的影响。

在MySQL 5.6.2前后的版本中,LRU list flush的不同之处在于是由用户线程发起,还是有后台page cleaner线程发起。但是,无论是用户线程,还是后台page cleaner线程,再决定需要进行LRU list flush之后,都会调用buf_flush_LRU函数进行真正的flush操作。

 
不同之处在于,MySQL 5.6.2之前,用户线程调用的buf_flush_free_margin函数,在判断是否真正需要进行LRU list flush时,将LRU list tail部分的clean pages也归为可以被replace的pages,不需要flush。而在page cleaner线程中,每隔1s,无论如何都会进行一次LRU list flush调用,无论LRU list tail中的page是否clean。这也可以理解,用户线程,需要尽量降低flush的概率,提高用户响应;而后台线程,尽量进行flush尝试,释放足够的free pages,保证用户线程不会堵塞。

 

Buffer Pool LRU/Flush List flush对比

1).LRU list flush,由用户线程触发(MySQL 5.6.2之前);而Flush list flush由MySQL数据库InnoDB存储引擎后台srv_master线程处理。(在MySQL 5.6.2之后,都被迁移到page cleaner线程中)
 
2).LRU list flush,其目的是为了写出LRU 链表尾部的dirty page,释放足够的free pages,当buf pool满的时候,用户可以立即获得空闲页面,而不需要长时间等待;Flush list flush,其目的是推进Checkpoint LSN,使得InnoDB系统崩溃之后能够快速的恢复。
 
3).LRU list flush,其写出的dirty page,需要移动到LRU链表的尾部(MySQL 5.6.2之前版本);或者是直接从LRU链表中删除,移动到free list(MySQL 5.6.2之后版本)。Flush list flush,不需要移动page在LRU链表中的位置。
 
4).LRU list flush,由于可能是用户线程发起,已经持有其他的page latch,因此在LRU list flush中,不允许等待持有新的page latch,导致latch死锁;而Flush list flush由后台线程发起,未持有任何其他page latch,因此可以在flush时等待page latch。
 
5).LRU list flush,每次flush的dirty pages数量较少,基本固定,只要释放一定的free pages即可;Flush list flush,根据当前系统的更新繁忙程度,动态调整一次flush的dirty pages数量,量很大。

 

buffer pool free list工作原理
free链表里存放的是空闲页面,初始化的时候申请一定数量的page,在使用的过程中,每次成功load页面到内存后,都会判断free page是否够用,如果不够用的话,就flush lru链表和flush链表来释放free page,这就可以满足其他进程在申请页面,使系统可用。

 

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

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

相关文章

Windows 运行... 可执行的命令

Windows "运行..." 可执行的命令 以下内容与操作系统版本有关,并不保证所有Windows都能运行 winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构(wmi) wupdmgr Windows更新程序 wscript Windows脚本宿主设置 write 写字板 winmsd 系统信息 wiaa…

深入浅出Android:初识Intent(BMI)

1、strings.xml 1 <?xml version"1.0" encoding"utf-8"?>2 <resources>3 4 <string name"app_name">BMI</string>5 <string name"height">身高(cm)</string>6 <string …

xcode10 自定义代码块

xcode10 之后自定义代码块已经不是10之前&#xff0c;直接将代码拖拽到代码块列表进行编辑了&#xff0c;10之后自定义代码块的方法&#xff0c;选择代码右键Create Code Snippet 在这里查看代码块 然后选中想要自定义的代码块&#xff0c;光标放在图标上&#xff0c;就会出现个…

MySQL 引擎特性 · InnoDB Buffer Pool

前言 用户对数据库的最基本要求就是能高效的读取和存储数据&#xff0c;但是读写数据都涉及到与低速的设备交互&#xff0c;为了弥补两者之间的速度差异&#xff0c;所有数据库都有缓存池&#xff0c;用来管理相应的数据页&#xff0c;提高数据库的效率&#xff0c;当然也因为…

Foursquare引爆了什么

我们可以把Twitter、Foursquare和Facebook看作新一代互联网的三个图层&#xff0c;“时间、地点、与谁一起”。这三个图层的叠加&#xff0c;就是未来互联网最完整的画面。 谷歌一直在寻找一种方法让天底下所有商户都到它的Adsense上来做广告。换句话说&#xff0c;就是创造一种…

“BindingNavigator”如何在删除前弹出确认框?

问题的缘起在于有一个学习数据操作的人询问我“BindingNavigator”如何点击“删除”前进行确认。我一开始模拟创建了一个表&#xff0c;然后通过设计器的方式生成了这四类控件&#xff0c;随后拖拽一个Navigator到WinForm上&#xff0c;双击红色叉叉部分&#xff0c;写入一个Me…

解决虚拟机卡顿、卡死、待机后不动的情况(真实有效

本人环境&#xff1a; VM workstation 17.5 ubuntu 22.04 虚拟机配置&#xff1a;4核 4g issue&#xff1a; 出现开机卡死不动运行一段时间&#xff0c;可能半小时不到&#xff0c;就页面卡死不动经常需要关机重启才解决&#xff0c;可能没有解决 1.配置虚拟化引擎 这一步我称…

JVM内存溢出时快照转存HeapDump到文件

# Heap Dump 获取方式使用 JVM 参数获取 dump 文件进入Tomcat的bin目录&#xff0c;在catalina.sh文件里添加如下内容 >-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathc:\jakarta-tomcat\webapps 然后使用MAT分析工具&#xff0c;如jhat命令&#xff0c;eclipse的mat插件…

为什么auto_ptr智能指针不能作为STL标准容器的元素

上个星期的博客shared_ptr源码剖析里其实遗漏了一个问题:为什么auto_ptr不可以作为STL标准容器的元素&#xff0c;而shared_ptr可以? 我在网上看了好多篇讲shared_ptr的文章里讲到了这个问题&#xff0c;不过大多文章只是简单两笔带过。我研究了一下这个问题&#xff0c;发现…

【读书笔记】MSDN 上关于加密解密的一个例子

MSDN上的一个不错的例子&#xff1a; 那从内存清除密码的句子有个问题。 需要再看看这个问题到底是怎么回事&#xff0c;怎么解决 cannot convert from Sytem.InPtr to ref string 把下面这句 public static extern bool ZeroMemory(ref string Destination, int Length); 用这…

[luogu3380][bzoj3196]【模板】二逼平衡树【树套树】

题目地址 【洛谷传送门】 题目大意 区间查询k的排名&#xff0c;查找k排名的数&#xff0c;单点修改&#xff0c;区间前驱&#xff0c;区间后继。 感想 真的第一次写树套树&#xff0c;整个人都不对了。重构代码2次&#xff0c;发现样例都过不了&#xff0c;splay直接爆炸&…

Parquet格式描述

背景 2010年 google 发表了一篇论文《Dremel: Interactive Analysis of Web-Scale Datasets》&#xff0c;介绍了其 Dermel 系统是如何利用列式存储管理嵌套数据的&#xff0c;嵌套数据就是层次数据&#xff0c;如定义一个班级&#xff0c;班级由同学组成&#xff0c;同学的信…

Notepad++ 快捷键 大全

修改快捷键的话&#xff1a;设置----管理快捷键----就好比第一个快捷键新建吧--------鼠标双击&#xff0c;然后会弹出来对话框让你对具体想要设置的快捷键进行设置&#xff0c;所有的快捷键都是这么设置的&#xff0c;但是我就是不明白&#xff0c;你要设置的是哪个&#xff1…

Kevin专栏---如何制作试用版安装包

首先需要在http://activationservice.installshield.com/doLogin.do注册一个试用账号。注册完成后系统会自动发送一个15天的试用账号和密码。 在图标Trialware Files上点击鼠标右键&#xff0c;创建一个试用配置项&#xff08;见下图&#xff09;。 首先选择试用文件&#xff0…

ldd命令解析

在linux中&#xff0c;经常会碰到查看可执行文件需要依赖哪些动态链接库&#xff0c;这时ldd命令就可以排上用场了 由于某种原因&#xff0c;屏蔽了一些内容&#xff0c;结果如下&#xff1a; 可以根据结果查找对应的动态链接库

UDP和TCP协议包大小的计算-转

UDP和TCP协议包大小的计算 UDP一次发送数据包的大小&#xff0c;TCP一次发送数据包的大小。MTU最大传输单元&#xff0c;这个最大传输单元实际上和链路层协议有着密切的关系&#xff0c;EthernetII帧的结构DMACSMACTypeDataCRC由于以太网传输电气方面的限制&#xff0c;每个以太…

洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图

第一次做最小割&#xff0c;不是很理解。 https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里&#xff0c;好像可以应用最小割的模板&#xff0c;其中一类A作为源点&#xff0c;另一类B作为汇点&#xff0c;价值就是边的容量。 然后最小割一定会割断每个中间结点…

LVS

1、安装lvs 在分发器上在172.16.10.1上执行&#xff0c;事先应该配置好你的yum源&#xff0c;保证能够读取介质中的Cluster目录&#xff01;&#xff03;yum install ipvsadm编写&#xff0c;分发规则&#xff08;注意&#xff0c;清空之前的防火墙iptable -F ; iptable -t nat…

linux Swap交换分区概念

Swap交换分区概念 什么是Linux swap space呢&#xff1f;我们先来看看下面两段关于Linux swap space的英文介绍资料: Linux divides its physical RAM (random access memory) into chucks of memory called pages. Swapping is the process whereby a page of memory is copie…

ThinkPHP 数据库操作(七) : 视图查询、子查询、原生查询

视图查询 视图查询可以实现不依赖数据库视图的多表查询&#xff0c;并不需要数据库支持视图&#xff0c;例如&#xff1a; Db::view(User,id,name)->view(Profile,truename,phone,email,Profile.user_idUser.id)->view(Score,score,Score.user_idProfile.id)->where(…