- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux 内核SMP负载均衡浅析Linux 内核SMP负载均衡浅析
Linux 内核SMP负载均衡浅析
需求在 《linux进程调度浅析》一文中提到,在SMP (对称多处理器) 境下,每个CPU对应
一个run_queue (可执行队列)。如果一个进程处于TASK_ RUNNING状态 (可执行状态),则
它会被加入到其中一个run_queue (且同一时刻仅会被加入到一个run_queue ),以便让调度程序
安排它在这个run_queue对应的CPU上面运行。
一个CPU对应一个run_queue这样的设计,其好处是:
1、一个持续处于TASK_ RUNNING状态的进程总是趋于在同一个CPU上面运行 (其间,这个
进程可能被抢占、然后又被调度),这有利于进程的数据被CPU所缓存,提高运行效率; 2、各
个CPU上的调度程序只访问自己的run_queue,避免了竞争;
然而,这样的设计也可能使得各个run_queue里面的进程不均衡,造成“一些CPU闲着、一
些CPU忙不过来”混乱局面。为了解决这个问题,load_balance (负载均衡)就登场了。
load_balance所需要做的事情就是,在一定的时机,通过将进程从一个run_queue迁移到另
一个run_queue,来保持CPU之间的负载均衡。
这里的“均衡”二字如何定义?load_balance又具体要做哪些事情呢?对于不同调度策略 (实时
进程 R 普通进程),有着不同的逻辑,需要分开来看。
实时进程的负载均衡
实时进程的调度是严格按照优先级来进行的。在单CPU 境下,CPU上运行着的总是优先级
最高的进程,直到这个进程离开TASK_ RUNNING状态,新任的“优先级最高的进程”才开始得到
运行。直到所有实时进程都离开TASK_ RUNNING状态,其他普通进程才有机会得到运行。 (暂
时忽略sched_ rt_ runtime_ us和sched_ rt_period_ us的影响,见 《linux组调度浅析》。)
推广到SMP 境,假设有N个CPU,N个CPU上分别运行着的也必须是优先级最高的top-N个
进程。如果实时进程不足N个,那么剩下的CPU才分给普通进程去使用。对于实时进程来说,这
就是所谓的“均衡”。
实时进程的优先级关系是很严格的,当优先级最高的top-N个进程发生变化时,内核必须马上
响应:
1、如果这top-N个进程当中,有一个离开TASK_ RUNNING状态、或因为优先级被调低而退
出top-N集团,则原先处于(N+1)位的那个进程将进入top-N 。内核需要遍历所有的run_queue,把
这个新任的top-N进程找出来,然后立马让它开始运行; 2、反之,如果一个top-N之外的实时进程
的优先级被调高,以至于挤占了原先处于第N位的进程,则内核需要遍历所有的run_queue,把这
个被挤出top-N的进程找出来,将它正在占用的CPU让给新进top-N的那个进程去运行;
在这几种情况下,新进入top-N的进程和退出top-N的进程可能原本并不在同一个CPU上,那
么在它得到运行之前,内核会先将其迁移到退出top-N的进程所在的CPU上。
具体来说,内核通过pull_ rt_task和push_ rt_task两个函数来完成实时进程的迁移:
æ ´å¤ ç²¾å½©æ »ç ¥è®¿é ® 1
pull_ rt_task – 把其他CPU的run_queue 中的实时进程pull过来,放到当前CPU
的run_queue 中。被pull过来的实时进程要满足以下条件:
1、进程是其所在的run_queue 中优先级第二高的 (优先级最高的进程必定正在运行,不需要
移动); 2、进程的优先级比当前run_queue 中最高优先级的进程还要高; 3、进程允许在当
前CPU上运行 (没有亲和性限制);
该函数会在以下时间点被调用:
1、发生调度之前,如果prev进程 (将要被替换下去的进程)是实时进程,且优先级高于当
前run_queue 中优先级最高的实时进程 (这说明prev进程已经离开TASK_ RUNNING状态了,否则
它不会让位于比它优先级低的进程); 2、正在运行的实时进程优先级被调低时 (比如通
过sched_setparam系统调用); 3、正在运行
您可能关注的文档
- HB-3000布氏硬度计HB-3000布氏硬度计.ppt
- HBS-3000直读布氏硬度计使用说明书HBS-3000直读布氏硬度计使用说明书.pdf
- HCG孕酮的关系HCG孕酮的关系.doc
- HDPE高密度聚乙烯双壁波纹管安装施工方案1HDPE高密度聚乙烯双壁波纹管安装施工方案1.doc
- HBTK-1000XQ探测器-技术说明书HBTK-1000XQ探测器-技术说明书.doc
- HD_Tune使用教程HD_Tune使用教程.pdf
- HE75xxH赫尔微CMOS线性稳压芯片HE75xxH赫尔微CMOS线性稳压芯片.pdf
- HE73XXM赫尔微CMOS线性稳压芯片HE73XXM赫尔微CMOS线性稳压芯片.pdf
- Henrik Parl-亚洲汇款与邮政组织、其他金融机构及支付提供者三者之间的新型合作关系_贷帮Henrik Parl-亚洲汇款与邮政组织、其他金融机构及支付提供者三者之间的新型合作关系_贷帮.pdf
- HE71XXM线性稳压芯片赫尔微半导体HE71XXM线性稳压芯片赫尔微半导体.pdf
文档评论(0)