标签:linu 异步 ble lru 自动 体系 while htm 过程
redo log先都写入该buffer,而后按一定频率刷新到磁盘(1s/次),默认8M。其刷到磁盘主要一下几个情况:
对一些数据结构本身的内存分配是从额外内存池分配。
负责将缓存池中的数据异步刷新到磁盘,包括脏页。合并插入缓存(INSERT BUFFER)、UNDO页的回收等。
Innodb中大量使用AIO处理写请求,IO Thread则主要处理这些请求的回调,包括write、read、insert buffer和log IO Thread。
主要用来回收undo log,Innodb1.1之前由Master Thread负责。
清理已提交事物的UNDO log。
事务型数据库一般采用Write Ahead Log策略,当事物提交时先写redo log而后修改内存中的页。当数据库宕机对于还未写入磁盘的修改数据可以通过redo log恢复。Checkpoint作用在于保证该点之前的所有修改的页均已刷新到磁盘,这之前的redo log在恢复数据时可以不需要了。
发生在数据库关闭时,将所有脏页写入磁盘,数据库运行时一般不使用。
只刷新部分部分脏页。
主要包括主loop、background loop、flush loop和suspend loop。其中的参数可以配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
while ( true ){ //差不多1s一次 for ( int i in 0..9){ 刷新日志缓存到磁盘 //1s内的统计值 if IO < 5 合并插入缓存 if 脏页比例 > 预定值 刷新部分脏页(不超过100) if 没有用户活动 进入background loop{ 删除无用undo页 合并20个插入缓冲 可能跳到flush loop{ 可能跳到suspend loop } 跳回主loop } sleep 1s; } //差不多10s一次 if IO < 200 //10s内 刷新100个脏页到磁盘 合并最多5个插入缓冲 刷新日志缓冲 删除无用undo 刷新100或10个脏页 } |
Master Thread中的脏页刷新功能完全由Page Cleaner Thread执行。
在对脏页刷新到磁盘时,如果某一页还没写完就宕机,此时该页数据已经混乱无法通过redo实现恢复。innodb提供了doublewrite机制,其刷新脏页步骤如下:
1. 先将脏页数据复制到doublewrite buffer中(2MB内存) 2. 将doublewrite buffer分两次,每次1MB写入到doublewrite磁盘(2MB)中。 3. 马上同步脏页数据到磁盘。对于数据混乱的页则可以从doublewrite中读取到,该页写到共享表空间。
InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive) 的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页建立哈希索引。
linux和windows中提供异步IO,其可以对连续的页做合并连续页的IO操作使随机IO变顺序IO。
刷新页时判断相邻页是否也是脏页。
标签:linu 异步 ble lru 自动 体系 while htm 过程
原文地址:http://www.cnblogs.com/tangshiguang/p/6741035.html