MD(四)进入syncd内部

本文探讨了Linux MD(Multiple Devices)中syncd的内部运作,特别是如何处理resync和recovery冲突。文章分析了md_do_sync函数,强调了其循环中的关键逻辑,包括速度监测、I/O调度以及如何给正常I/O让路。通过分析sync_request函数,揭示了RAID-5在resync过程中的行为,并指出在极端情况下存在的潜在bug及其修复方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这些文章已经写了好几年了,可能已经过时了。在MSN space和QQzone几经辗转之后,我想也许这些技术文章还是放在搞技术的博客中更能帮助人。于是做了一个艰难的决定,把这些文章一篇篇搬过来!绝对是原创的。

 

 

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

 

首先来看这个函数中最前面的一个循环。这个循环的作用避免resync/recovery冲突。这里所谓“冲突”,我的理解就是同一个设备处于不同的MD中,这些MD同时做resync就会发生冲突。用一般的IDE硬盘举个例子来说,假如我们有三个硬盘hda,hdb和hdc,将他们分别创建两个分区,用hd[abc]1三个设备组建一个RAID-1,同时用hd[abc]2组建一个RAID-5,于是他们都需要做resync,他们各自的syncd都注册启动,但是只有一个能进行resync,另一个只能被delay。要避免这种冲突应该是出于resync效率的考虑,因为同一个hd上两个分离的区域同时做I/O并不是高效的做法。关于这个循环是如何完成这项避免冲突的任务的,我也不想多讨论,因为对于curr_resync的重用我也还没有完全理解,而且对于那两个指针来比较大小的做法我总觉得很奇怪,如果有谁花时间理解了这些内容,希望能跟我讲解讲解。在这个循环中最重要的无非就是match_mddev_units这个函数的调用,它能发现冲突的MD。 

 

在正式进行resync/recovery之前,先要确定有多少扇区要做resync/recovery。Resync与recovery需要的扇区数可能会不同,但通常来讲都是设备的物理大小。接着,就是对resync/recovery做初始化。首先,如果是resync,我们会将recovery_cp作为resync的起始扇区。接着,初始化一些时间戳变量,用作resync/recovery计算速度的数据。在resync/recovery中会用到一个变量window,它的值被设为32*(PAGE_SIZE/512),也就是256个扇区。Window的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值