摘要:
本篇分析bitmap的数据结构的设计,并基于此分析bitmap的工作机制。 为了后面更清楚的理解,先有个总体印象,给出整体的结构图: 在下面的描述中涉及到的内容可以对照到上图中相应部分,便于理解。 首先,我们从宏观的角度来分析整体结构。bitmap file存在于磁盘,内部存放着很多个bi... 阅读全文
摘要:
本想就此结束Raid1的专题博客,但是觉得Raid1中自己构建的一套barrier机制的设计非常巧妙,值得单独拿出来分析。它保证了同步流程和正常读写流程的并发性,也为设备冻结/解冻(freeze/unfreeze)机制提供了保障。 Barrier的意思就是,在某个请求设置上barrier之后,... 阅读全文
摘要:
Raid1的源码的读、写、同步,在本系列博客中都已经分析完成。除了barrier机制要专门拿出来分析(下一篇会写)以外,有一些问题值得思考和注意,分析如下。1、freeze_array是如何做的? 通过barrier挡住上层用户io请求,并且nr_waiting++计数。nr_pending表示... 阅读全文
摘要:
同步的大流程是先读,后写。所以是分两个阶段,sync_request完成第一个阶段,sync_request_write完成第二个阶段。第一个阶段由MD发起(md_do_sync),第二个阶段由守护进程发起。 如果是用户发起的同步请求。该请求下发到raid1层,首先进入同步读函数sync_re... 阅读全文
摘要:
正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio。假设盘阵中有N块盘。然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆出来一个bio结构,然后进行相应设置。 对于没有Write Behind模式而言,之后将所有这... 阅读全文
摘要:
最近在做bwraid的R6的设计工作,需要调研一下bitmap下刷磁盘的IO属性(是否为SYNCIO),还有raid5中bitmap的存储和工作方式。1、bitmap刷磁盘是否为 SYNC IO? 这样分为两种情况进行分析。前面写过的博客中提到过:bitmap可以有两种存储方式,一种是inte... 阅读全文
摘要:
1. page_attrs的状态转换关系 之前说过,bitmap的优化核心是:bitmap设置后批量写入;bitmap延时清除。写bit用bitmap_statrwrite() + bitmap_unplug()两个函数,实现了bitmap设置后的批量写入;清bit用bitmap_endwrite... 阅读全文
摘要:
bitmap的清零是由bitmap_daemon_work()来实现的。Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_daemon_work根据各种状态进行清零的操作。Bitmap_daemon_work的实现比较复... 阅读全文
摘要:
1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1)同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志。而在下发写请求给磁盘之前,必须保证bitmap文件下刷完成后才向磁盘发送写请求。这种情况需要等待写bitmap磁盘文... 阅读全文
摘要:
在MD模块中,各级raid都使用的一份bitmap的源码,也就是说共用一种bitmap的流程,下面以raid1的使用为例来分析bitmap的工作原理。 在使用raid1磁盘阵列的时候,对于数据的可靠性有很高的要求。在写的过程中,有可能存在不稳定的因素,比如磁盘损坏、掉电/宕机、网络故障、系统故... 阅读全文