在上一篇博客中<http://blog.csdn.net/wingter92/article/details/75253375>,讲到PowerDatacenter:
的确,Cloudsim中的power系列类最关键的是PowerDatacenter,因为整个数据中心的能耗统计都由它完成,并且其重载了一些重要事件处理方法,如processCloudletSubmit()和processVmMigrate(),在数据中心状态推进方面调用的主要是自己的方法:updateCloudletProcessing() => updateCloudetProcessingWithoutSchedulingFutureEventsForce()
这篇博客介绍power系列类中的PowerHost、PowerVM,他们不是实体,但提供统计能耗所需的信息。
1、PowerHost
继承:extends HostDynamicWorkload;这一点很重要,因为父类HostDynamicWorkload记录了host的CPU利用率(in MIPS),同时提供了关于CPU利用率、RAM利用率、BW利用率的一系列get()和set()函数。在PowerHost中,这些资源利用率要用来传给PowerModel计算功耗。
新成员:
powermodel(一个PowerModel类对象)
新方法:
getPower():调用(父类的)getUtilizationOfCpu()获得当前时刻利用率,再传给powermodel.getPower(util)获得功耗(Watt)
getMaxPower():调用powermodel.getPower(1),即利用率为1.0。
getEnergyLinearInterpolation(double fromUtilization, double toUtilization, double time):这个很关键,是利用简单插值估算一个时间窗口time内的主机能耗,估算方式是取首尾两点的平均功耗*时间,当然首尾两点的功耗是getPower(util)出来的。 值得一提的是,在PowerDC的update操作中,对最近这个时间窗口内的总能耗统计是通过累加各个host的总能耗,各个host的总能耗就是由该函数计算得到。
setPowerModel()、getPowerModel():设置、获取的PowerModel成员。
重载方法:
无,完全继承了父类HostDynamicWorkload的updateVmsProcessing()方法。
1-a、PowerHostUtiliztionHistory
继承:PowerHost
新成员:无
新增的方法:
protected double[] getUtilizationHistory():获取该host的利用率历史记录。它的计算方法是遍历host上的所有VM,提取它们的利用率历史记录(vm.getUtilizationHistory()),然后累加返回。
Note:如果在调度过程中,不需要主机的历史利用率,则该方法用不到。不过在Power包的带迁移VM调度策略类中,很多方法接收或返回的是PowerHostUtiliztionHistory对象,因此自定义调度策略类时,采用PowerHostUtiliztionHistory对象会有比较好的扩展性(Java多态)。
2、PowerVm
继承:Vm
新成员:
List<Double> utilizationHistory:很关键,其记录了该VM的历史CPU占用(in MIPS),历史记录一般会在VM调度策略中用到。
HISTORY_LENGTH:历史记录中的数据个数
previousTime:上一次本VM的利用率更新的时刻,在updateVmProcessing()中被推进到currentTime,但必须满足currentTime是整数个最小调度间隔——这里有些疑问,因为任务状态更新时刻很可能不是整数,这可能导致utilizationHistory缺少记录。
schedulingInterval:VM内的最小调度间隔,每两个历史记录之间至少间隔一个schedulingInterval。
新方法:
都是关于新成员的set(), get()方法
重载方法:
@Override
public double updateVmProcessing(currentTime, mipsShare) :调用了父类VM.updateVmProcessing( , ),然后向utilizationHistory中添加利用率记录(如果(currentTime-0.1) % utilizationHistory == 0,0.1我理解为模拟中实体的启动延迟),然后推进previousTime到currentTime。
3、PowerModel
类型:是一个Interface
API:就一个,getPower(double)函数;
这里以它的一个典型实现:PowerModelLinear——线性能耗模型为例
PowerModelLinear
成员:
maxPower:最大功耗,即右端点(u=1)
constant:直线的斜率,分子是功耗,分母是[0,100]
staticPower:静态功耗
方法:
构造方法:PowerModelLinear(double maxPower, double staticPowerPercent):根据staticPowerPercent和maxPower就能得到staticPower,再两点一线得出斜率。
其它都是关于成员的set、get函数。