linux内核md源代码解读 八 阵列同步二:同步过程
7348行,同步默认是physical size,也可以是virtual size。如果你第一次阅读就能明白其中的意思,那么恭喜你是一个内核天才。如果我这一次讲完你能看懂,那么恭喜你是一个内核人才。如果看不懂也没有多大关系,毕竟大多数人都只是想混混日子而已,只要有一颗向上努力的心,始终都有市场的。想当初我也是抱着赵炯博士的linux内核完全注释足足看了七遍,整本书都已经被我笔记得体无完肤了,但是仍然只是一知半解。所以看不懂没有关系,但是要把握两点:一是要把握方法,看懂原理挑重点看,二是多动手修改几行代码试试,并且持之以恒。 那什么是physical size,什么是virtual size?物理大小就是单个磁盘用于创建阵列空间的大小,虚拟大小就是阵列大小。怎么样,终于相信自己是内核天才了吧!那为什么同步要有这样的区别呢?这就要跟阵列的特性相关了,raid5阵列是属于前者,按磁盘从头到尾同步,raid10阵列是属于后者,是按照镜像对进行同步的。 接下来是reshape和重建,跳过。 7375行,打印阵列同步信息。 7376-7380行,打印同步速度信息。同步有速度控制是为了不影响正常数据流。 7382行,初始化rdev->last_events。函数is_mddev_idle用于控制同步速度,当一小段时间内IO太多时会休眠来降低同步速度。 7384 io_sectors = 0; 7385 for (m = 0; m < SYNC_MARKS; m++) { 7386 mark[m] = jiffies; 7387 mark_cnt[m] = io_sectors; 7388 } 7389 last_mark = 0; 7390 mddev->resync_mark = mark[last_mark]; 7391 mddev->resync_mark_cnt = mark_cnt[last_mark]; 7392 7393 /* 7394 * Tune reconstruction: 7395 */ 7396 window = 32*(PAGE_SIZE/512); 7397 printk(KERN_INFO "md: using %dk window, over a total of %lluk.n", 7398 window/2, (unsigned long long)max_sectors/2); 7399 7400 atomic_set(&mddev->recovery_active, 0); 7401 last_check = 0; 7402 7403 if (j>2) { 7404 printk(KERN_INFO 7405 "md: resuming %s of %s from checkpoint.n", 7406 desc, mdname(mddev)); 7407 mddev->curr_resync = j; 7408 } 7409 mddev->curr_resync_completed = j; 7385-7391行,同步点记录的初始化。这里设置了几个观察点,用几个观察点之间下发的数据流速度来控制同步线程。 7396行,设置窗口大小,数据流大小这个窗口大小才进入观察点。 7400行,下发但未返回请求的大小。 7403行,继续同步的。 7409行,设置同步完成点。 (编辑:徐州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |