自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(24)
  • 收藏
  • 关注

原创 RAID5 Write Hole

最近一段时间又重新接触了RAID,这次是关于RAID5 Write Hole的问题。这里把我对这个问题的理解描述一下。Write Hole是RAID5的一个重大缺陷,这个问题在我以前的日志中已经提到过,但是只是作为解释代码的引子,而没有强调它的重要性。要了解这个问题,首先要对RAID5的rcw和rmw有一定了解。我以前的文章(RAID-5(五)rmw与rcw )已经解释过这些动作。为了方便说明,假设有一个5个盘的RAID5(为什么是5个盘?因为rmw)。

2011-02-17 12:15:00 3440 4

原创 MD(七)In_sync标志与resync

关于mddev->in_sync的作用我一直只是一知半解,前段时间终于有机会将它的用法重新理解了。原来它是出于数据安全考虑的。

2011-02-16 17:44:00 1543

原创 MD(六)小议superblock

Superblock通常总是用来保存一些配置信息,MD中的superblock也不例外,通过看md_p.h中的mdp_superblock_s的定义大致就能了解其内容。MD的Superblock保存的信息主要包括:(1)基本信息(Constant generic information) :主从设备号,UUID,RAID级,size,设备数量等;(2)一般状态信息(Generic state information):包括一般MD运行的统计信息;(3)Personality information:看上去似

2011-02-15 12:27:00 1194

原创 MD(五)MD中的线程

实际上MD中线程的调度都是植根于linux中的调度,我这里为什么要单独拿出来讨论讨论?因为我觉得MD的线程写法挺有意思,让我受益匪浅。

2011-02-14 12:30:00 878

原创 MD(四)进入syncd内部

看md_check_recovery中注册syncd的代码,就能知道syncd执行的动作就是函数md_do_sync。这个函数也不是省油的灯!

2011-01-28 12:30:00 1267

原创 MD(三)resync和recovery的调度(下)

说完启动再来看它的结束。同样是在md_check_recovery中,但我们会发现处理结束的代码处于处理启动的代码之前。其中的逻辑其实也很好理解,无非就是先处理已经启动的线程,但是由于我在阅读这部分代码时花了点时间,所以多罗嗦几句。实际上,光是md_check_recovery中的代码实际上并没有完全结束resync和recovery,只是结束了syncd,从这段代码注释中的“double check”就可以看出来。我们还是先看看syncd是如何结束的,再看resync和recovery如何停止。结束syn

2011-01-27 17:46:00 1076

原创 MD(三)resync和recovery的调度(上)

说到调度,一般都是说进程或者线程调度,这里也不例外,因为resync和recovery都是由一个后台的MD工作线程在执行的,我们且称之为syncd。不再象2.4那样在RAID启动时为其注册一个syncd,如果没有工作就一直休眠,有resync的需要时就起来工作,2.6内核是在有resync需要时才注册syncd,在resync完毕就将其注销;2.6也不象2.4那样将resync线程与recovery线程分开,而是在需要时注册一个线程需要做resync就做resync,需要recovery就做recovery

2011-01-26 17:17:00 1070

原创 MD(二)resync和recovery概论

到底什么是resync和recovery?虽然我们在RAID-5中讨论了它们的作用,但是它们并不只存在于RAID-5中,所以很多通用的操作被提到了MD中来。

2011-01-26 12:14:00 1177

原创 MD(一)数据结构

要看MD的数据结构,那就得看md_k.h了。这里有最主要的三个结构定义:mddev_s这是MD本身的结构;mdk_rdev_s这是对应于MD中子设备的结构;mdk_personality这是个有函数指针组成的结构,各函数交由各RAID级自己去实现。

2011-01-25 12:37:00 1102

原创 Multiple Devices

RAID-5中我们已经多次提到MD的作用,MD提供了很多控制功能。请容忍我刚想到的一个比喻,MD就像一个DVD机,而各级RAID就像各种DVD光盘,DVD机播放的内容由放在里面DVD光盘决定,没有光盘,DVD机也不能起作用,没有DVD机,我们也无法享受光盘中的电影了;正是有了DVD机,我们不仅可以装入不同的光盘,而且还可以快进、快退,调节音量…等等。正因为这样,我们知道DVD机就比DVD光盘要复杂,同样的道理,MD相对于RAID-5而言又更复杂一些,我们可以看md.c有5000多行,是RAID-5的两倍多。

2011-01-24 17:37:00 985

原创 RAID-5(十三)其它

前面几篇林林总总,从RAID-5原理,到错误,失效处理,主要还是围绕数据处理的方方面面来说的,但是RAID-5要能正常使用,没有一些控制函数的辅助是不可能的。我所说的这些控制函数可以在raid5.c快要结束的地方,在raid5_personality这个结构中找到他们的名字。

2011-01-24 09:31:00 933

原创 RAID-5(十二)resync与recovery

但是我们有必要知道resync和recovery在RAID-5中的作用。我们知道RAID-5在写数据时需要计算Parity,更重要的是如果做的是 rmw,那就要求Parity在写之前必须已经正确的写到下层设备中。

2011-01-21 12:28:00 1694

原创 RAID-5(十一)stripe_head的管理

前面其实我们已经看到了一些stripe_head管理的结构,比如handle_list,delayed_list。我们知道,stripe_head是在RAID-5开始运行的时候开辟的缓冲区,这是个有限的资源,那么除了要在数据处理过程中需要调度以外,还需要一套完整的机制去使得这些有限的资源能够满足数据情求的处理所需。

2011-01-20 16:54:00 1287 1

原创 RAID-5(十)raid5d线程

raid5d是RAID-5的守护线程,我们知道make_request将数据做了初步处理以后就结束了,那么这个stripe_head的后续处理权就都交到了raid5d的手里。

2011-01-20 10:07:00 966

原创 RAID-5(九)handle_stripe

这个函数就像RAID-5数据处理的核心。前面我们所讲的一些操作如rmw和rcw,BSR,延迟写大部分的相关代码都能在handle_stripe中找到。这个函数有近500行的代码,可见这个函数要处理的内容有多么丰富,弄懂了这个函数,基本上就能理解linux中RAID-5数据是如何处理的。

2011-01-19 17:15:00 982

原创 RAID-5(八)失效处理

所谓失效(failed),我这里指的是RAID-5下层设备无法正常工作。比方说,下层的n个设备中有两个设备发生了故障,那么在这两个设备上的数据将无法再读写,因为你无法直接读取盘上的数据,也无法通过Parity将这些数据计算出来,同时,写的时候也无法提供足够数据来计算Parity。也就是说,RAID-5已经无法正常工作。

2011-01-19 12:07:00 1270 2

原创 RAID-5(七)Error处理

RAID-5能提供一定程度的可靠性,也就是说能容忍一定程度的错误,那么在I/O中出现错误的时候, RAID-5时如何处理的呢?

2011-01-18 12:28:00 1336

原创 RAID-5(六)延迟写

延迟写是RAID-5中提高I/O吞吐率的一种重要的方法。延迟写(delay write),顾名思义就是在make_request将写请求加入到stripe_head中以后,并不急于启动写处理(rmw或rcw),而是等一段时间,看是不是有后续的写请求也会被加入到这个stripe_head中。最好的情况就是后续加入的写请求填满了所有的数据dev,这样我们就不需要任何额外读就可以计算新Parity。这在顺序写(sequential WRITE)的情况下能带来很好的效果,而实践中很多情况都是顺序写的。别看前面的一些

2011-01-17 17:49:00 1271

原创 RAID-5(五)rmw与rcw

对于写请求的处理,可以分为read_modify_write(rmw)和read_reconstruct_write(rcw)。由于前面介绍一次简单的写处理时假设了sh只有一个dev需要写,于是就按照rmw的过程来介绍了。但事实上,一个sh中可能有多个dev要写,这就产生了一个问题:如何能减少这次处理的所需的预读操作?正如前面描述的,为了计算Parity,一些预读处理是不可避免的。所以,区分rmw和rcw就是为了使这些预读尽可能少。

2011-01-17 12:18:00 2329

原创 RAID-5(四)make_request

make_request是RAID-5数据路径的源头,正如我们前面对读写简单叙述中提到的,make_request就是取出stripe_head并将bio插入相应的dev链表,最后对stripe_head做第一轮处理。但我们看make_request的代码,并不是就这么简单的,它还有一些特殊的情况需要处理。

2011-01-14 17:02:00 1607

原创 RAID-5(三)简单的读写

一次简单的读处理一次简单的写处理

2011-01-14 10:25:00 1328

原创 RAID-5(二)数据结构

bio 与 stripe_head

2011-01-13 17:37:00 1639

原创 RAID-5(一)基础

通常阅读RAID的代码,都是从RAID-0开始,因为RAID-0中并没有复杂的逻辑,而是仅仅是将送入RAID-0的数据重新映射并送入下层设备。我最初也是从RAID-0开始的,但是由于工作关系目前我对RAID-5更熟悉一些,还是从我熟悉的东西开始入手,虽然RAID-5比RAID-0复杂百倍。好吧,那就开始进入RAID-5之旅…

2011-01-13 12:25:00 1511

原创 RAID概述

RAID就是冗余磁盘阵列。目前市面上的电脑主板上,一般都不难看到产品参数中看到支持磁盘阵列Raid0,Raid1等等,这在一定程度上说明RAID已经越来越普遍,用句古文说就是“旧时王榭堂前燕,飞入寻常百姓家”。虽然我自己目前还不知道这些主板上说明的RAID跟linux的软件RAID有些什么关系,或者说我从来没机会使用这些RAID功能,但是这确实是说明了RAID技术的广泛应用,了解一些RAID知识不会错的。在linux内核中,软件RAID是一个不可缺少的一部分,通常它会和LVM共同出现。现在googl

2011-01-12 17:49:00 677

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除