Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244224
  • 博文数量: 32
  • 博客积分: 557
  • 博客等级: 中士
  • 技术积分: 431
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-20 23:05
文章分类

全部博文(32)

文章存档

2015年(4)

2014年(2)

2012年(4)

2011年(22)

分类: LINUX

2011-07-21 18:25:49

请看附件,里面使用了公式编辑器,word打开需开启宏
 按照RCU的分析经验,上来就先看了相关的数据结构,然后找到sched_init函数,准备画架构图,却也分析的云里雾里。这也是正常的,马克思教导我们,发展要经历否定之否定,任何事情都是螺旋上升的。所以不可能一次将这一块完全搞清楚,必须在有个大概的轮廓之后,再结合其他部分对这些数据结构的应用,才能更清楚的理解。

牵涉到的数据结构主要有sched_group, sched_domain, sched_class, sched_statistics, sched_entity, sched_rt_entity;
task_struct, task_group, runqueue, cfs_rq.

在这里也能体现出管理流与执行流的区别,在这里执行流就是进程调度,即从rq中选出task_struct来执行,以及对进程状态变化的处理;管理流就是CPU负载平衡。

已经看了两天,执行流中各数据结构的关系(rq, cfs_rq, se, ts)相对清晰;平衡流中数据结构(rq, cpu, sd, sg, tg, cgroup)很是复杂,并且牵涉其他模块如cpumask, cgroup,topology等,其他概念如SMT/MC/SMP/NUMA。并且这只是初始化部分,随着CPU hotplug,和cgroup task_group的创建和销毁,还会增加和删除sched_doamin。

好,有难度才好,有问题就一个一个的列出来,摆正顺序,一个一个克服。
列出来就会发现其实也就只有那几个问题。

本文会研究两个方面:
① CFS/RT进程调度算法关联的数据结构含义,忽略statistics;
② 负载均衡,前期重点在于理清sched_domain、sched_group的关系,后期研究过载与平衡的过程;
③ 为达成以上两点,需要具备的知识,过程中解决

本人基础:
① 去年大致看过schedule函数,sched fair的enqueue,dequeue过程;
② ULK3 看过两遍(忘了很大一部分)

PS: damn chinaunix,从blog换成了blog168,看来要做两手准备了,这些东西不好丢,丢不起;
本文内容,同时参见

总结全文
画图,去除“.png”后缀,使用visio查看
介绍multi-core的load-balance时performace and power saving之间的权衡
介绍根据ACPI SLIT构建multi-level sched_domain结构
阅读(11870) | 评论(41) | 转发(3) |
给主人留下些什么吧!~~

wangjianchangdx2011-07-25 14:07:35

正面强攻了几天,效果十分不明显。
其实上面的任务也已经完成了一大半了,只需要再研究一下smp初始化过程中,对cpumask,core map, sibling map的初始化,建立cpu架构体系,就可以了。但是这是另外一个主题了,我也不想做过多纠缠。在这个问题上已经花费了太多的时间和精力,牛角尖也钻的太深,思维已经严重阻塞,继续下去,事倍功半。
还是回到主体任务,提纲挈领。

wangjianchangdx2011-07-24 11:46:35

暂时放弃,不纠结这个图的问题了

wangjianchangdx2011-07-24 02:37:29

刘勃那张图的画法是错误的

from sched_domain.txt:
Groups may be shared among CPUs as they contain read only data after they have been set up.
从代码的情况下,smt/mc的sd/sg是percpu的,也就是说,无论每个cpu有多少core,那core所对应的sd/sg也都只有一个。
这里percpu的用法与一贯的用法,有相当大的区别。
按照一贯用法的解释,这个percpu的sd/sg就要代表所有cpu中的cores/smts;而这里的用法,某cpu的core/smt的sd只覆盖该cpu本身的core/smt,与其他cpu的core/smt无关,而groups是coremask或siblingmask中的cpu共用的。这种做法是不可靠的。

wangjianchangdx2011-07-23 01:14:45

cpu_core_map/cpu_sibling_map没完没了了,也在情理之中,这样才正常~
After all, I love it~

wangjianchangdx2011-07-23 01:01:59

可以这样假定,从配置NUMA系统芯片选择的要求上,以及各个NUMA的结构图上来看,NUMA的每个节点上CPU的个数都是相同的。
那是不是所有的node的nodemask都是相同的,nodemask只需计算一次,并且这个是否需要allnodes的判断也只需要进行一次呢?
答案是否定的,因为cpu可以hotplug,sched_init_smp调用arch_init_sched_domains的时候,传入的参数就是‘cpu_active_mask’。为什么不能只计算一次呢?因为不知道第一个CPU所在的node是不是所有node中online的cpu最多的;为什么不设置一个变量,记录是否有cpumask_weight(cpu_map) <=   (SD_NODES_PER_DOMAIN * cpumask_weight(d->nodemask))的情况呢?这是不是有点复杂了?如果真的发现了,前面的怎么办?
OK,虽然不准确,也只能将就了:(
BTW, it's the most ugly code i'v