Linux 内核SMP负载均衡浅析Linux 内核SMP负载均衡浅析.pdf

Linux 内核SMP负载均衡浅析Linux 内核SMP负载均衡浅析.pdf

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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、正在运行

您可能关注的文档

文档评论(0)

vshoulrengb3 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档