- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多处理器运队列的平衡
正如我们在上一节所看到的,schedule( )函数从本地CPU的运行队列挑选新进程运行。因此,一个指定的CPU只能执行它相应的运行队列中的可运行进程。另外,一个可运行进程总是存放在某一个运行队列中:任何一个可运行进程都不可能同时出现在两个或多个运行队列中。因此,一个保持可运行状态的进程通常被限制在一个固定的 CPU上。这种设计通常对系统性能是有益的,因为,运行队列中的可运行进程所拥有的数据可能填满每个CPU的硬件高速缓存。但是,在有些情况下,把可运行进程限制在一个指定的CPU上可能引起严重的性能损失。例如,考虑频繁使用CPU的大量批处理进程:如果他们绝大多数都在同一个运行队列中,那么系统中一个CPU将会超负荷,而其他一些CPU几乎处于空闲状态。因此,内核周期性地检查运行队列的工作量是否平衡,并在需要的时候,把一些进程从一个运行队列迁移到另一个运行队列。但是,为了从多处理器系统获得最佳性能,负载平衡算法应该考虑系统中CPU的拓扑结构。从内核2.6.7版本开始,Linux提出一种基于“调度域”概念的复杂的运行队列平衡算法。正是有了调度域这一概念,使得这种算法能够很容易适应各种已有的多处理器体系结构(甚至诸如那些基于“多核”微处理器的新近出现的体系结构)。
1 调度域
调度域实际上是一个CPU集合,他们的工作量应当由内核保持平衡。一般来说,调度域采取分层的组织形式:最上层的调度域(通常包括系统中的所有CPU)包括多个子调度域,每个子调度域包括一个CPU子集。正是调度域的这种分层结构,使工作量的平衡能以如下有效方式来实现:每个调度域被依次划分成一个或多个组,每个组代表调度域的一个CPU子集。工作量的平衡总是在调度域的组之间来完成。换而言之,只有在一些调度域的某些组的总工作量远远低于同一个调度域的另一个组的工作量时,才把进程从一个CPU迁移到另一个CPU。下图说明三个调度域分层实例,对应三种主要的多处理器机器体系结构:
?
图中(a)表示具有两CPU的标准多处理器体系结构中由单个调度域组成的一个层次结构,该调度域包括两个组,每个组有一个CPU。图中(b)表示一个两层的层次结构,用在使用超线程技术、有两CPU的多处理器结构中。最上层的调度域包括了系统中所有四个逻辑CPU,它由两个组构成。上层域的每个组对应一个子调度域并包括一个物理CPU。底层的调度域(也被称为基本调度域)包括两个组,每个组一个逻辑CPU。最后,图中(c)表示有两个结点,每个结点有四个CPU的8-CPUNUMA体系结构上的两层层次结构。最上层的域由两个组构成,每个组对应一个不同的结点。每个基本调度域包括一个结点内的CPU,包括四个组,每个组包括一个CPU。每个调度域由一个 sched_domain描述符表示,而调度域中的每个组由sched_group 描述符表示。每个sched_domain 描述符包括一个groups字段,它指向组描述符链表中的第一个元素。此外,sched_domain 结构的parent字段指向父调度域的描述符(如果有的话)。struct sched_domain {??? /* These fields must be setup */??? struct sched_domain *parent;??? /* top domain must be null terminated */??? struct sched_group *groups;??? /* the balancing groups of the domain */??? cpumask_t span;??? ??? ??? /* span of all CPUs in this domain */??? unsigned long min_interval;??? /* Minimum balance interval ms */??? unsigned long max_interval;??? /* Maximum balance interval ms */??? unsigned int busy_factor;??? /* less balancing by factor if busy */??? unsigned int imbalance_pct;??? /* No balance until over watermark */??? unsigned long long cache_hot_time; /* Task considered cache hot (ns) */??? unsigned int cache_nice_tries;??? /* Leave cache hot tasks for #
文档评论(0)