最近在做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. sqlcipher移植

    一.下载代码 sqlcipher赖openssl库,首先下载openssl: [fulinux@ubuntu ~]$ git clone https://github.com/openssl/open ...

  2. Spring AOP 实现原理与 CGLIB 应用--转

    AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 ...

  3. [转] Ubuntu 12.04下LAMP安装配置 (Linux+Apache+Mysql+PHP)

    我是一个Linux新手,想要安装一台Ubuntu 12.04版的Linux服务器,用这台服务器上的LAMP套件来运行我自己的个人网站.LAMP套件就是 “Linux+Apache+Mysql+PHP这 ...

  4. NYOJ737

    题意:给n堆石子,按照顺序排列,只能相邻两堆石子合并,求最后合并为一堆时所花费的最小代价,石子合并代价为两堆石子之和. 输入: n(石子堆数) Xi(每堆石子个数) 输出: T(最小代价) 思路:经典 ...

  5. ZOJ1524

    题意:给定需要购买物品的顺序以及总物品对应的价格,求解按顺序购买物品时最小花费. 输入: m,n(m代表需要购买物品的清单,n代表总的物品数) Xi...(代表对应物品的序号以及价格) 输出: cos ...

  6. YII框架中php入口文件隐藏

    Apache配置修改 主要修改下httpd文件中的两个地方 1.启用mod_rewrite.so模块,在Apache的配置文件中找到如下行,去掉前面的字符"#",保存 #LoadM ...

  7. mockServer学习

    mockServer学习 很喜欢mockserver官方主页的背景颜色和格式 官方主页如下: http://www.mock-server.com/

  8. 本机运行.net 2.0项目报错,解决方案

    本机在iis上运行.net 2.0项目时,报以下错误“请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理”: 本机环境配置: 安装有以下几个.net 版本:v1.0.3705,v1.1.4322 ...

  9. Git简明教程

    http://www.jianshu.com/p/16ad0722e4cc http://www.jianshu.com/p/f7ec8310ccd2

  10. 武汉科技大学ACM :1004: 零起点学算法74——Palindromes _easy version

    Problem Description “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串.请写一个程序判断读入的字符串是否是“回文”. Input 输入包含多 ...