最近在做bwraid的R6的设计工作,需要调研一下bitmap下刷磁盘的IO属性(是否为SYNC IO),还有raid5中bitmap的存储和工作方式。

1、bitmap刷磁盘是否为 SYNC IO?

  这样分为两种情况进行分析。前面写过的博客中提到过:bitmap可以有两种存储方式,一种是internal,一种是external。internal bitmap是存放在raid设备的成员盘的superblock附近(可以在之前也可以在之后),而external是单独指定一个文件用来存放bitmap。

  当bitmap以internal方式存放时,盘整中每个成员盘都会存放一份bitmap,这种情况的bitmap下刷为SYNC IO,此时下刷bitmap的bio属性BIO_RW_SYNCIO和BIO_RW_UNPLUG均有;

  当bitmap以external方式存放是,整个盘阵的bitmap只有一份(很有可能存储在盘阵设备之外),这种情况的bitmap下刷不是SYNC IO。
  SYNC IO意味着bio下发之后,不会停留在写缓存设备之后就认为已写入并返回,而会要直到IO落入真正的物理设备之后才会认为写入并返回。
 
2、bitmap在RAID5中如何存储和工作?
  

  R5的bitmap与R1相比较总体上的工作方式一致,这里我们仅分析internal方式存储的bitmap,这种情况bitmap会存储在每个成员盘上(包括数据盘和校验盘)。
  同样数据不一致则置1,一致则置0;“批量置1,延迟清0”的原则仍然适用;bitmap的刷磁盘的写IO为sync io(其实从磁盘读bitmap到内存中时的读IO也为sync io)。
  要注意bitmap是针对R5设备而言,而非针对各个成员盘。也就是说bitmap的1个bit代表的是R5地址空间中的一个chunk的数据是否一致。内存中存储有唯一的一份bitmap,并且会在写请求下发之前将其固化到每个成员盘(包括数据盘和校验盘)。每个成员盘有一份bitmap,每份bitmap都相同,成员盘中存储的数据是否对称对其没有影响。
  1) 假设场景是一块成员盘坏掉,换上新的盘,则需要做全盘恢复,与bitmap无关;
  2) 假设场景是拔掉了一块盘,之后又将其插上,则根据bitmap来进行精准恢复(读取该成员盘之外的其他成员盘数据,算校验/数据并写入该成员盘),此时没有掉电根据的bitmap为内存中的那份bitmap;
  注:根据rdev->saved_raid_disk的值来判断是否为这种情况。
  3) 假设场景是整个盘阵掉电,然后上电重启,则从一个可以工作的成员盘上读取bitmap到内存,然后进行精准恢复。
  注:3.1) 重启之后,用户使用命令发送Assemble给mdadm;
         3.2) mdadm处理这个命令,会调用start_array,而start_array会下发RUN_ARRAY的ioctl给md;
         3.3) md接收到该ioctl之后函数,读取成员盘上的bitmap到内存的调用路径:
                     md_ioctl -> do_md_run -> bitmap_create -> bitmap_init_from_disk -> read_sb_page -> sync_page_io

MD中bitmap源代码分析--SYNC IO和RAID5的补充的更多相关文章

  1. MD中bitmap源代码分析--数据结构

    本篇分析bitmap的数据结构的设计,并基于此分析bitmap的工作机制. 为了后面更清楚的理解,先有个总体印象,给出整体的结构图: 在下面的描述中涉及到的内容可以对照到上图中相应部分,便于理解. 首 ...

  2. MD中bitmap源代码分析--入题概述

    在MD模块中,各级raid都使用的一份bitmap的源码,也就是说共用一种bitmap的流程,下面以raid1的使用为例来分析bitmap的工作原理. 在使用raid1磁盘阵列的时候,对于数据的可靠性 ...

  3. MD中bitmap源代码分析--清除流程

    bitmap的清零是由bitmap_daemon_work()来实现的.Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_d ...

  4. MD中bitmap源代码分析--设置流程

    1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1) 同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志.而在下发写请求给磁 ...

  5. MD中bitmap源代码分析--状态机实例

    1. page_attrs的状态转换关系 之前说过,bitmap的优化核心是:bitmap设置后批量写入:bitmap延时清除.写bit用bitmap_statrwrite() + bitmap_un ...

  6. Hadoop源代码分析【IO专题】

    由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化.Hadoop并没有采用Java的序列化(因为Java序列化比较复杂,且不能深度控制),而是引入了它自己的系统. ...

  7. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...

  8. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  9. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

随机推荐

  1. [ES6] ... spread operator

    var parts = ['shoulders', 'knees']; var lyrics = ['head', ...parts, 'and', 'toes']; // ["head&q ...

  2. Zend框架2入门(二) (转)

    Zend框架2使用一个模块系统,和你组织内每个你的主应用程序特定代码模块.骨架提供的应用程序模块是用于提供引导,错误和路由配置到整个应用程序.它通常是用来提供应用水平控制器,比如说,应用程序的主页,但 ...

  3. 深入探讨 java.lang.ref 包--转

    概述 Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类.这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 ...

  4. IIS rewrite映射规则语法格式

    IIS rewrite映射规则语法格式,特殊符号:&请用& amp;代替,否则异常. <configuration> <system.webServer> &l ...

  5. C#截图操作方法大全

    using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { class ScreenC ...

  6. Html.ActionLink简单用法(转)

    一 Html.ActionLink("要显示的文字","actionName") 该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法, 默认 ...

  7. Javascipt 时间格式化(日期)

    Date.prototype.format =function(format){ var o = { "M+" : this.getMonth()+1, //month " ...

  8. 运维监控利器smokeping 500报错处理

    检查apache日志发现有以下错误: No such file or directory: exec of '/usr/local/smokeping/htdocs/smokeping.cgi' fa ...

  9. Asp.net Repeater控件

    Repeater控件和DataList控件,可以用来一次显示一组数据项.比如,可以用它们显示一个数据表中的所有行.     Repeater控件完全由模板驱动,提供了最大的灵活性,可以任意设置它的输出 ...

  10. InstallShield 覆盖安装

    “吾乐吧软件站”提供了很全面详细的InstallShield制作安装包教程(http://www.wuleba.com/23892.html),但是按上面的方法再次制作的升级安装包,安装后会在系统中同 ...