Chinaunix首页 | 论坛 | 博客
  • 博客访问: 820880
  • 博文数量: 162
  • 博客积分: 5308
  • 博客等级: 大校
  • 技术积分: 2152
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-15 19:09
个人简介

DevOps让系统管理更轻松。

文章分类

全部博文(162)

文章存档

2014年(28)

2012年(10)

2011年(6)

2009年(60)

2008年(58)

我的朋友

分类:

2009-03-13 10:45:40

 

(以下文章中所说的CPU,如无特别说明,都是传统意义上的CPU,也就是一个物理CPU,一个指令流处理单元)

IBM POWER4多核开始,IBM的CPU弄得越来越复杂。业界别的厂商也一起煽风点火,加上集成商、销售的大嘴,标书撰写者的有意混淆视听或无意不懂装懂,这CPU是越来越乱了。本文是为了澄清一些事实而写。在写东西之前,先统一概念定义。不同厂商可能有不同的说法,但在这大家先统一一下,免得说来说去被偷换了概念。另外下面的概念多是IBM的概念,别的厂商也应当有类似的名词,请对照使用。

Actived
激活的CPU,IBM通过CUoD License控制,可以让你只使用一部分机器中安装的CPU,这样下次你升级CPU的时候,就不需要硬件更换插拔停机等操作,输入一个激活码,CPU就出来了。

Book
大型机器CPU被一组一组地安装在一个可拆卸模块里面,外面有铁皮保护,插脚也不会是CPU上脆弱而密集的针、点接触,便于维护。通常升级、更换的时候必须以一个book为单位进行。例如这种机型一个book里面是8个CPU,那你就不能购买4个,最少就是8个,或者16个,24个CPU这样去购买。但如果用户需要10个CPU怎么办?那物理采购的还是16个,但通过CUoD激活只激活10个。采购的价格虽然比10个CPU的价值稍多(不会多很多),但是以后升级方便。另外更重要的是CUoD只计算活动CPU的数量,也就是如果在运行过程中,忽然一个CPU坏掉了,只要还有未激活的CPU,就会自动顶替上,始终保证用户可用的CPU数量是10个,避免了因为CPU坏掉而造成的停机(根据坏CPU当时执行的线程有关),如果是用户线程,通常分区不会死掉。但无论多严重的故障,也只是一个分区出问题,别的分区还会照常运行。

Core
这就是一个传统意义的CPU,一个计算单元。之所以叫Core是由于以前集成电路技术不高,一个Core就是一个物理存在的一个集成电路芯片。但现在随着集成电路技术提高,多个CPU被集成到一个芯片内,而人们往往还是对一个芯片叫做一个CPU,所以以前传统意义的CPU就被降格为Core,一个“核心CPU”。

CPU
原始意义的CPU是指计算机的中央处理器,而现在多指一个封装模块,也就是说可能多个中央处理单元连同辅助的协处理器内存缓存管理器等等只要被封装在一个集成电路芯片里,就被称为一个CPU。

CUoD
Capacity Upgrade on Demand容量按需升级。IBM提出的一种硬件License管理技术,就是购买时多买一些物理资源(CPU,内存等等,通常与只购买使用的CPU、内存相比,额外成本很低),但通过激活码控制,只能使用一部分,当需要的时候,随时购买新的激活码,激活不能使用的CPU和内存,实现升级。

HMT
Hard Multi-Thread 硬件多线程。这里要注意区分多指令和多线程。在CPU里面执行指令,指令仿佛水流一样在流动。对于现代的多任务操作系统而言,同一个时刻,有很多任务(线程)需要处理,即使是多个CPU,也不能满足同时处理线程数的要求。也就是说,系统可能只有4个CPU,但同时要求处理的线程数可能已经达到了100个,每个CPU平均要处理25个。由于一个线程要处理很长时间,甚至属于永不终结的线程,操作系统不能完全处理完一个线程,等其退出再去处理另一个,如果这样,别的线程大概就要等几分钟,甚至几小时,也许永远等不到那一天(如果此线程是无限循环的)。所以操作系统使用的折中的方案,就是每个线程处理一段时间,当此线程暂时不需要CPU或者处理了太长的时间之后,通过分时的方式,把此线程停下来,而去执行另一个线程。这也就是说,通过“软”的方式,实现了多线程处理。由于这是操作系统的软实现方案,每次线程切换都需要执行额外的指令(操作系统指令),因此切换效率比较低。IBM POWER系列CPU从RS64型号之后,就开始支持硬切换了,也就是CPU能够完成指令切换。注意,在CPU这个级别,它根本不知道什么线程不线程的,只能看到一列指令。当指令在执行的时候,很可能会停下来,等待一些辅助操作,例如等待中断、必须的数据或指令不在Cache中,这时候CPU执行的指令流都会中断,而去等待新的指令流接续。HMT技术就是将这个等待时间利用起来,把另一组需要执行的指令调入CPU执行,这样就比以往增加了CPU的利用度,减少CPU空闲时间。

HT
Intel对HMT的称呼,可以说是一种HMT的技术实现。

Installed
安装的物理资源,就是机器里面装的CPU或者内存数量。不过这些资源并不一定全都可用,由于物理故障被deconfig,由于没有买License而没有激活,都会使可用的物理资源数少于安装的资源数。

lcpu
从操作系统看到的可用CPU,又被称为逻辑CPU。从操作系统角度,一个CPU的概念是能够在当时(无需分时等额外处理)处理一条指令流(也就是一个线程)的执行单元。多任务操作系统可以同时并行执行很多线程,但是这种并行并不是严格意义上的并行,而是多CPU并行(这是真正意义上的并行)及分时并行的混合结果。从用户角度看来,如果以1秒钟时长取平均,那么10个CPU,每个CPU花一秒钟执行完1个线程和1个CPU每0.1秒执行完1个线程,总效果都是1秒钟总计执行完10个线程,效果是一样的,但是这两种做法操作系统底层编程显然有区别。精细的考察,多CPU系统线程执行比较“平滑”,但是对于不能进行线程拆分(例如有严格的执行顺序要求)的程序,执行效果较差,因为可能9个CPU闲置,无事可做,而第10个CPU非常忙;单CPU系统“抖动”比较大,在多线程环境响应不太好,对于某个特定的线程而言,偶尔有短暂“死机”感觉(在多任务调度不好的操作系统,或者某个线程有非常高的计算、内存数据移动要求时尤其如此)。在AIX中,使用vmstat命令可以看到,在POWER5,6等支持SMT技术的机型中,lcpu是2倍于proc的数值,这是由于这两种CPU,能够利用SMT技术,单一CPU同时执行两条线程的指令流,看起来好像多了一倍的CPU。

Module DCM, QCM, MCM
多个CPU内核(core)被集成到一个集成电路芯片里,每块这样的集成电路芯片就叫做一个Module,如果是双核芯片,被称为Dual Core Module,4核叫做Quad Core Module,很多个核叫做Multi-Core Module

Pipe Line
CPU的一种设计、实现方式。CPU在处理指令的时候,需要经过取指令、解码指令、处理指令、放置结果等多个子过程,为了提高效率,可以采用流水线作业的方式,一条指令在取指令,前一条已经进入解码阶段,再前一条则正在处理,再之前的一条则已经到了放置结果阶段。通过这种技术,以前一个子过程需要1微秒,4个子过程则需要4微秒,也就是一条CPU指令需要4微秒的时间才能完成。而用流水线技术则1微秒就可以完成一条指令,当然CPU刚启动执行的第一条指令还要等4微秒,不过也仅仅等着一次。其它需要等待的时间是发生了指令跳转(包括指令转移),下一条要执行的指令不一定在什么地方,这样预先取址、解码的指令可能不是下一条要执行的指令,流水线就中断了,需要重新初始化流水线。但无论怎样,大部分指令,例如80%的指令都能顺序下来,流水线的效率还是很高的。另外,CPU设计者引入了其它的办法协助解决这个问题,例如如果解码到的指令是条件指令,会触发取址指令把可能的跳转目的地址的指令都取出来进行解码,这样无论条件判断出来转到那里,指令都已经解码好了,缺点是需要额外的解码单元电路;还有的做法是进行一些“智能”分析,大概估算出跳转的可能,并与编译程序配合,在程序编译的时候就做出适当的组合和特别标志位,协助CPU进行条件跳转的判断。

Physical CPU
与虚拟、逻辑CPU对比而言,一个实实在在能马上执行指令的CPU单元就是物理CPU,其它的虚拟CPU,逻辑CPU则是从高层系统看起来是个CPU,可以执行指令,但指令只是交给了物理CPU硬件,用某种队列方式进行处理,并不能真正立即执行。

Proc
AIX操作系统中看到的CPU,是Processor的简称,可能是一个物理CPU或者通过虚拟化技术虚拟出的虚拟CPU,到底是物理CPU还是虚拟CPU,则根据机型不同。如果是POWER5、6的机型,看到的是虚拟CPU,如果是POWER4或更早的机型,则是物理CPU。虚拟CPU和物理CPU之间有一定的对应关系,请参考Virtual Processor的说明。

Processing Unit
IBM POWER5或6机型的物理CPU被称为Processing Unit,简称PU

Processor
同proc

Socket
同Module,但略有不同。Module一般指一个芯片,而一个Socket可能是一个小电路板,上面焊了几个芯片。

SMT
Simultaneous Multi-Thread。模拟多线程,但这不是用软件模拟,而是硬件CPU本身来“模拟”是POWER5,6 CPU特有的技术。当一个物理CPU单元执行指令的时候,由于在某个瞬间,只是一条指令在执行,而CPU是为了处理各种各样指令而设计,好比是一个加工工厂,同时有车钳铣刨多种设备,但这个工厂每次只加工一个工件,SMT技术则考虑到有很多个加工设备,同时弄进几个工件(指令)进行处理。但这种技术不同于pipe line和super scale,也不同于HMT。可以理解为SMT同时利用了HMT和pipe line/super scale的优点。

pipe line/super scale是指令层面的技术,只对单独的指令流有效,它们看不到线程这么高的层次。而对于线程层次的认知则几乎可以完全避免指令跳转造成的CPU指令流流水线中断,因为两个线程指令之间完全不可能存在相互依存关系,两组指令流之间的执行顺序可以任意调整,绝对不可能冲突;

HMT技术则只处于线程切换层次,与指令层结合的时候不“平滑”,也就是切换的时候要把当前的指令流停下来,或等待当前指令流停下,这样就存在一个短暂的指令中断间隙。虽然这个暂停时间很短,例如只是1,2个时钟周期,但如果频繁发生HMT切换,这个中断时间也不少。

SMT同时利用了两者的优势,通过操作系统内核和CPU的特殊标志寄存器,让CPU在进行指令流调度的时候,把两组线程的指令调配到同一条物理CPU的处理流水线上,这样一来,一个线程在进行加法运算,另一个线程可能需要跳转,它们两者显然使用不同的寄存器进行操作,可以同时被处理,而且不用担心它们两者之间会发生干涉,例如一组指令更新另一组指令的输入结果,这是不可能发生的!因为操作系统对线程的定义就是他们之间没有直接相互关系。线程之间的通信通过更高层的共享内存空间、信号灯等机制完成,其结果就是一条:两组指令流都可以畅快地执行,没有干涉发生。

SMT虽然在指令执行并行性上实现了突破,但并非万能。如果两组指令流在某个时刻都在进行乘法运算,出现了竞争同一个物理CPU寄存器的情况,其中一条指令流还是要停下来的。这时候POWER5,6 CPU使用HMT的能力,一条指令流无中断执行,另一条指令流被硬切换出去,再调入其它线程的指令流。总之,SMT技术使单一物理CPU永远至少能够执行1条以上指令流,最好的情况下能够达到并行两条,平均而言,一般是1.3-5倍的执行效率。在AIX操作系统,为了反映出这个额外的指令流处理能力,使用了逻辑CPU,也就是lcpu的概念。


Super Scale
与Pipe Line技术对应,这是CPU电路设计的另一种方案,在这种方案中,CPU一次取一组指令,进行统一解码、执行。如果完成一条指令需要4微秒,那么只要能同时取4条指令并行处理,则平均1条指令完成时间就变成了1微秒,CPU执行速度大大提高。这种方案同样会遇到条件跳转问题,解决方案与Pipe Line技术类似,例如同时虚拟执行条件跳转的两个(或者多个)目标地址的指令,最后通过条件指令的结果去实际选择到底采用那个分支。当然,这也需要CPU硬件电路、编译系统配合,来提高执行效率。

Virtual Processor/VP
也也是IBM POWER 5,6 CPU引入的技术。这两种CPU能够让操作系统以为有若干物理CPU,但实际上只分配给它们很少一部分物理CPU时间片,只有当有处理要求的时候,才把物理CPU的时间片交过去,执行指令。初始分配时最大的比例是1:10,运转过程中动态分配的比例是1:100。这里面涉及的分配过程稍微复杂一点,我下一节再继续说,看到这时你才能了解你到底有多少CPU,能用多少CPU,是怎么用的。


Way
可以把Way等同于物理CPU,等同于core,等同于Processor Unit/PU

现在我先交代一下分配规则(以下都是针对POWER 5,6的机型的说明,POWER 4及以前的机型,分配了多少物理CPU,就是多少,毫无疑问)。
给一个分区分配的物理CPU可以是0.1到物理机器所有可用的(激活)的物理CPU(Processor Unit / PU)中间的任何数值,小数点后只有1位。如果整机有16颗激活的CPU,则一个分区可以分配的物理CPU可以是0.1,0.8,6.4 .... 15.9到16中的任何数值。这个数值被称为Entitlement的CPU(EC)数。也就是说,对于这个分区,EC的数量是必保的,你可以不使用那么多,但是只要你想用,无论发生什么情况,你一定能拿到这么多。
于此对应,在进行分区的时候还要分配Virtual Processor (VP)。前面说过,VP是给操作系统看的,也就是蒙骗操作系统,让它“认为”你分了多少物理CPU给它。VP数量必须是整数,让操作系统去对用户讲0.1个CPU过于复杂,IBM不想把事情弄得太乱了。另外,既然是虚拟的,那就不能少了,只有你这种大公无私的人才会借给别人5.3元,却对他说:就当我借给你5块好了!IBM不会这么傻,它会告诉操作系统:6块!实际上,更激进一些,它可以让操作系统觉得拥有从6-53中间任何整数的CPU。也就是说,VP最少是圆整后的EC的整数值,最多是10倍的EC/PU。当然,也有上限,就是操作系统(AIX)目前支持的最大CPU个数:64。如果一个物理机器最多物理CPU个数为32,你给一个分区分配了6.4的EC,虽然理论上你可以分配给这个分区64的VP,但超过32的数值没有实际意义,仅可用来作为支持测试。
VP仅仅是虚数,给操作系统炫耀的么?当然不是,它还是有实际意义的,但必须处于uncapped(不封顶)状态下才有效。uncapped也是四个分区CPU资源分配参数之一(到现在,我们有了EC或者叫PU,VP, uncapped,还有另一个weight一会会提到)。如果uncapped参数设定的是no,则VP多少都没用,操作系统最多用到分配的PU就到头了。但如果uncapped,那就可以继续“抢占”,只要别的分区(在同一CPU共享池内)有空闲的PU(分配的EC并未使用100%);或者物理整机有未分配的PU;或者POWER 6机型有可以“抢占”专属分区(物理CPU不共享)空闲CPU的license(不共享还可以抢占?!IBM还卖这种霸道的License,掉到钱眼里了)。抢占的上限就是VP的个数。因此,一个uncapped的分区,操作系统看起来有VP个“物理CPU”,如果使用传统意义上按CPU数量收费的软件,并且有技术限定,会监视CPU个数,则需要按VP个数购买license(你肯定亏了!)。分区最少可以使用0个物理CPU(其实怎么也是大于0,多少需要一点);如果别的分区不太忙,或者整机有空闲的物理CPU,则此分区最多可以抢占到VP个物理CPU;如果别的分区也很忙,大家都要抢占,那就看各自的weight,按照weight比例抢占,但无论如何,必保此分区分配的PU,也就是EC,这是别的分区抢不走的。
那么还有一些东西,在做分区的时候,Processor Unit 和 Virtual Processor的min, desire, max有什么关系?这三个参数只和你分区启动时能获得多少物理、虚拟CPU,以及分区运行过程中,可以动态迁移的物理、虚拟CPU的最大、最小数量有关。也就是分区启动是,尽力获得desire的数值,如果不行,则尝试最多能获得多少,只要大于min数值就可以启动分区。分区运行过程中动态迁移CPU资源(物理、虚拟都包括),能移走资源,使分区达到的最小值就是min,不能移走更多。反之,能加进资源,是分区达到的最大值就是max,也不能加进来更多。
你到现在明白你有多少CPU了么?
如果你是好学后进,大概此时还意犹未尽:规则我了解了,但IBM技术上如何实现的呢?看官,您继续耐心坐会。。。
无他,还是时间片技术。当然,着不仅仅是软件技术,更需要硬件技术。具体来说,是两硬加一软。物理CPU本身有能力进行快速线程切换;操作系统知道自己所处的虚拟环境,积极加以配合;特殊的管理硬件(在IBM叫做Hypervisor)有一些寄存器用来保存CPU运行状态,例如PURR,Processor Utilization Resource Register,并可以控制CPU进行强制进程切换。
首先,时间被切成以10ms为单位的小时间片,分区所能使用的时间片通过hypervisor控制进行分配,PURR用来记录时间片的使用情况。奇妙的是,绝对意义上,CPU自己是不知道自己是否繁忙的,因为CPU始终在执行指令,即使没有任何任务可做,CPU也在执行指令----操作系统的管理指令。操作系统的空闲进程会插入一些空指令,这是最基本的空闲标志,CPU看到这些空指令,会毫无疑问地把当前进程转到等待,可惜,空指令实在是太少了,在当今这种复杂的多任务管理系统环境,长时间执行类似x86上0x90操作码的空指令几乎不可能。其实CPU经常是很闲的,不知是执行空指令的时候,因为CPU有太多组件,不是所有的组件都忙得要死,跟一个大公司一样,忙的人忙死,闲的人闲死。CPU还有其他的空闲时候,例如,每当线程进入中断等待、操作系统无可执行队列的时候,此时操作系统主动更新某些特殊的寄存器,才可能让CPU知道,现在不忙了,可以休息了。当然,CPU也可以自我感觉繁忙程度,但是不太准确。典型的情况包括刚才提到的空指令,其它情况包括:长时间CPU都没有使用某些寄存器(或者访问频度很少),都没有进行内存数据访问,没有IO,所有指令都在L1 cache里面等等,这都说明CPU比较闲了。
这两种CPU繁忙的判断方式导致了虚拟化技术的两种不同实现。Intel等采用的是trap-and-emulate,也就是对特殊指令进行捕捉和仿真。在x86一类CPU里面有中断陷入、空操作等等指令(或者指令执行的结果),通过对这一类指令进行捕捉,就可以发现CPU处理暂停的时候。不过这种捕捉太细致,是指令级,会产生大量的指令流content switch,这些都是虚拟化后CPU的额外消耗增加。IBM则是采用操作系统自我认知方案,称为paravirtualization,让操作系统定期执行特殊的系统调用,告诉hypervisor自己现在的状态。这两种方案各有优缺点。Intel的方案对于操作系统没有要求,只要能够在老CPU、系统运行,就可以在新的支持虚拟化的CPU上执行。缺点是虚拟化系统开销较大;IBM的方案需要能支持虚拟化调用的新版本操作系统,自行汇报工作情况,hypervisor就可以很好地安排资源分配,效率更高,但以前版本的操作系统就无法在新虚拟化CPU上运行了。顺便说一句,不仅仅虚拟化,CPU在设计的时候,也可能有电源管理功能,当出现长时间闲置的电路,就可以暂时关闭(或降低)这部分电路的供电系统,降低执行频率等等,这是比指令更底层的技术实现,不用CPU指令干预(当然可以通过设定一定参数干预)。缺点呢?就是当CPU真的需要这部分电路,需要有一个电路启动过程,可能额外消耗几个,甚至几十个时钟周期。无论如何,这些指令级的繁忙程度判断是不准确的,虽然CPU可以根据最近执行的调用中,多少是用户调用,多少是系统调用,多少中断等等数据进行判断,总不如操作系统直截了当告诉Hypervisor。实际上,IBM的Power 5,6CPU也不全依靠操作系统,它是一个混合体,可以说80%依靠操作系统汇报,20%自己统计指令情况。这个百分比是我猜测的,到底算法如何,IBM这时候的嘴巴闭得很严,全无International Big Month的作风。
其次,有了当前物理CPU使用比例,就可以判断给某个分区分配物理CPU的数量,也就是PU的数值,它基于以下几个数据,同样,具体算法大嘴巴也没说全,半遮半掩,我只能在这胡说,您也就胡听好了。
Capped分区,最多分配分区profile设定的EC数量,不能多。但如果物理CPU使用比率低,则可以少分。
UnCapped分区,如果物理CPU使用比率高了,则可以多分PU时间片。多分多少呢?先把在同一个CPU共享池内的必保的都分配掉,假如剩下3.6个PU空闲,而有3个UnCapped分区争夺时间片,每个分区EC的cpu都是1,额外获得多少则要看Weight。
Weight 额外分配PU   
分区1 128 3.6*128/(128+255+32)=1.11PU,实际最多可分配CPU 2.11,对应于211个10ms时间片
分区2 255 3.6*255/(128+255+32)=2.21PU,实际最多可分配CPU 3.21,对应于321个10ms时间片
分区3 32  3.6*32/(128+255+32)=0.28PU,实际最多可分配CPU 1.28,对应于128个10ms时间片

最后,10ms的时间片和PU到底是怎么分配的?真正用起来,也不可能用0.1个物理CPU啊?!其实很简单,所谓共享粒度为1/100物理CPU就是10ms的时间片。还是刚才提到的分区,1个物理CPU分为100个10ms的时间片段,那么在下一个1秒内,分区1将获得1+1.11=2.11PU;分区2获得2.21PU;分区3获得1.28PU。那么再进行10ms时间片细分,每个时间片下如果有非0数字,则说明在这个时间片时刻当时会分配物理CPU给此分区:
时间片时刻
1 2 3 4 5。。。10 11 12 13 14。。。 100
--------------------------------------------------------------------------------------------
分区1 2 2 2 2 2。。。2  2 2 2 2。。。 2 累计100个2=200
1 0 0 0 0。。。0  1 0 0 0。。。 1 累计11个1=11
--------------------------------------------------------------------------------------------
分区2 3 3 3 3 3。。。3  3 3 3 3。。。 3 累计100个3=300
0 1 1 0 0。。。0  0 1 1 0。。。 0 累计21个1=21
---------------------------------------------------------------------------------------------
分区3 1 1 1 1 1。。。1  1 1 1 1。。。 1 累计100个1
0 0 0 1 1。。。1  0 0 0 1。。。 0 累计28个1
---------------------------------------------------------------------------------------------
累计 6 6 6 6 6。。。6  6 6 6 6。。。 6 总计660个PU时间片
以上的时间片都是真正的物理CPU时间(PU),具体分配的时候还有虚拟CPU,即Virtual Processor,在版本稍老一点的AIX(其实都是5.3或6.1,不过TL早一些而已),采用平均分布策略。也就是这些物理时间片会被Virtual Processor均分。还是刚才的分区,假设分区1有10个VP,分区2有5个VP,分区3有20个VP。在每个时间片时刻,操作系统和Power虚拟化Hypervisor会进行物理CPU时间片与虚拟CPU时间片之间的对应。我们单看一个分区,分区1:
时间片时刻1,分区1分得3个CPU时间片,但又10个VP,也就是有10个线程(其实是20个,由于lcpu的原因,为了简化起见,就当10个吧)被执行。但其中只有3个VP能对应到物理CPU,因此只有头3个VP上的线程能运行,别的VP上的线程停工待料。通常,一个线程不可能平平安安地执行完完整的10ms,中间总会有点“事情”发生(例如中断、内存换页等等),其优先级不够,要被踢出去,在进行踢线程这个当口,以前的情况是没有虚拟CPU一说,踢线程就是当前CPU踢的,踢完马上载入下一个线程进来。现在呢,有了虚拟CPU,就如同一个纺纱车间有10台机器,但只有一个人看管,一台机器的问题处理完,上下料这时候,这个人一转身,就到下一台机器前接线头去了。也就是说,虚拟CPU把要干的活都准备好了,转等物理CPU空闲,过来马上就干。由于时间粒度是0.01秒(10ms),为了保证不出现虚拟CPU太多,物理CPU时间片太少,虚拟CPU在长时间内都没有物理CPU时间片对应的问题,Hypervisor在设计的时候就做出了最多1:10的限制,也就是1个物理CPU(PU)最多可以虚拟10个虚拟CPU(VP),这样在0.1秒钟的时间里,即使线程非常繁忙,一个虚拟CPU至少能分到1个10ms时间片。反之,分给VP最多的物理时间片就是分满了,一个VP完完整整对应了一个PU。
了解了以上策略,又引出了一个新问题:在物理CPU一定的情况下,给一个分区分配更多的虚拟CPU好呢,还是更少为好?多少算合适?这个问题和你的体重一样不好回答。你是运动员的体质,每天高强度训练,不是为了比赛,只要身体好,多重都不算重;反之,如果你整日坐在计算机前敲程序,能少还是少一点的好。。。总结一下,如下几方面需要综合考虑(注意,只考虑了运行状态,没有考虑profile里面min,max的等问题):
1. 分区最大希望能用到多少物理CPU? VP的数量决定了上限,分配总有个限度。如果物理整机才有16个物理CPU,你分了20的VP干什么?
2. 分区最少会用到多少物理CPU?这一条不太重要,因为不用的PU别的分区会抢占,所以通常只是用来设定profile里面min PU的
3. 分区平均用到多少物理CPU?既然平均用这么多,那么设定EC为这个数值是比较合适的,也就是desire的PU
4. VP当然是大于EC的整数,而根据分区任务量特点,可以是1.5倍,2倍的PU,考虑到1的结果,设定一个相近的数值
5. 操作系统版本决定了VP选择的时候是往大了取,还是往小。如果是比较高的TL,例如5.3 TL07 (忘记了),可以取大点的数值,否则小一点比较好。
对于5的解释是这样的:由于VP和PU进行时间片对应的时候,即使IBM做好了POWER CPU,hypervisor,操作系统的综合考虑,这种时间片切换总是要消耗些CPU cycle的,如果采用平均分配时间片策略,显然不如集中分配时间片策略效率高,不过这就需要操作系统改变策略,将线程尽量排满一个VP再去填充下一个VP,而不是一视同仁,只要有VP就分配一个线程过去。这个策略需要操作系统schedo的新参数vpm_xvcpus(default是0,就是enable的)。如果希望填充更多的VP,则可更改此参数为一个特定值,当然是少于全部VP总数(其实是VP数×2-1,因为在实际应用中,此参数对应的是lcpu,并不是VP),大于VP总数也没用。另一个极端的设置是-1,所有VP大平均。由于系统缺省是尽量填充满VP再去填下一个,因此通过能识别单个CPU繁忙程度的软件,例如topas,将看到1个CPU很忙,别的CPU都闲(topas看到的是lcpu)。
现在你真正知道你有几个CPU了么?



版权归垃圾猪orain所有。
阅读(5781) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~