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行,设置同步完成点。 (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

