source: DCWoRMS/branches/coolemall/src/experiments/e2dc2015/models/i5/CpuEnergyEstimationPlugin.java @ 1593

Revision 1593, 12.3 KB checked in by wojtekp, 8 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package experiments.e2dc2015.models.i5;
2
3import schedframe.resources.StandardResourceType;
4import schedframe.resources.computing.Node;
5import schedframe.resources.computing.Processor;
6import schedframe.resources.computing.coolemall.NodeGroup;
7import schedframe.resources.computing.profiles.energy.ResourceEvent;
8import schedframe.resources.computing.profiles.energy.power.StandardPowerStateName;
9import schedframe.resources.devices.Device;
10import schedframe.resources.devices.Fan;
11import schedframe.resources.devices.PhysicalResource;
12import schedframe.scheduling.manager.tasks.JobRegistry;
13import simulator.DataCenterWorkloadSimulator;
14import eduni.simjava.Sim_system;
15import example.energy.BaseEnergyEstimationPlugin;
16import experiments.e2dc2015.EnvironmentConditions;
17import gridsim.dcworms.DCWormsTags;
18
19public class CpuEnergyEstimationPlugin extends BaseEnergyEstimationPlugin {
20
21       
22        private double timestamp = 0;
23        private double old_temperature = EnvironmentConditions.i5_cpuTidle;
24        private double new_temperature = -1;
25        private double objective_temperature = EnvironmentConditions.i5_cpuTidle;
26       
27        private boolean fan = false;
28       
29        private double next_timer = -1;   
30       
31        private int cpu_temp_monitor = 0;
32        public double estimatePowerConsumption(ResourceEvent event, JobRegistry jobRegistry,
33                        PhysicalResource resource) {
34                /*double powerConsumption = 0;
35
36                Processor cpu = (Processor)resource;
37                powerConsumption = Pidle + (Pfull- Pidle) * cpu.getLoadInterface().getRecentUtilization().getValue()/100;                       
38
39                return powerConsumption;*/
40               
41                double processorLoad = 0;
42                double powerConsumption = 0;
43                Processor proc = (Processor)resource;
44                if(resource.getPowerInterface().getPowerState().equals(StandardPowerStateName.OFF))
45                        return 0;
46                else {
47                        processorLoad = proc.getLoadInterface().getRecentUtilization().getValue();
48                        double lowestLoadLevel = 100;
49                        double highestLoadLevel = 0;
50                        if(proc.getPowerInterface().getPState().getLoadPowerUsage().containsKey(new Double(processorLoad))){
51                                powerConsumption = proc.getPowerInterface().getPState().getLoadPowerUsage().get(new Double(processorLoad));
52                        } else {
53                                for(Double load: proc.getPowerInterface().getPState().getLoadPowerUsage().keySet()){
54                                        if(lowestLoadLevel > load){
55                                                lowestLoadLevel = load;
56                                        }
57                                        if(highestLoadLevel < load){
58                                                highestLoadLevel = load;
59                                        }
60                                }
61                                if(processorLoad == 0){
62                                        try{
63                                                powerConsumption = proc.getPowerInterface().getSupportedPowerStates().get(0).getPowerUsage();
64                                        } catch (Exception e){
65                                                powerConsumption = 0.7 * proc.getPowerInterface().getPState().getLoadPowerUsage().get(new Double(highestLoadLevel));
66                                        }
67                                } else {
68                                       
69                                        double lowerLoadLevel = lowestLoadLevel;
70                                        double higherLoadLevel = highestLoadLevel;
71                                       
72                                        try{
73                                       
74                                                for(Double load: proc.getPowerInterface().getPState().getLoadPowerUsage().keySet()){
75                                                        if(processorLoad > load){
76                                                                lowerLoadLevel = load;
77                                                        }
78                                                        else if(processorLoad < load){
79                                                                higherLoadLevel = load;
80                                                                break;
81                                                        }
82                                                }
83                                                double powerBelow;
84                                                double powerAbove;
85                                                double a;
86                                                double b;
87                                                if(lowerLoadLevel != higherLoadLevel) {
88                                                        powerBelow = proc.getPowerInterface().getPState().getLoadPowerUsage().get(lowerLoadLevel);
89                                                        powerAbove = proc.getPowerInterface().getPState().getLoadPowerUsage().get(higherLoadLevel);
90                                                        a = (powerAbove - powerBelow)/(higherLoadLevel - lowerLoadLevel);
91                                                        b = powerAbove - a * higherLoadLevel;
92                                                } else {
93                                                        powerBelow = proc.getPowerInterface().getPState().getLoadPowerUsage().get(lowestLoadLevel);
94                                                        powerAbove = proc.getPowerInterface().getPState().getLoadPowerUsage().get(highestLoadLevel);
95                                                        a = (powerAbove - powerBelow)/(highestLoadLevel - lowestLoadLevel);
96                                                        b = powerAbove - a * highestLoadLevel;
97                                                }
98                                                powerConsumption = a * processorLoad + b;
99                                        } catch (Exception e){
100                                                powerConsumption = 0.7 * proc.getPowerInterface().getPState().getLoadPowerUsage().get(new Double(highestLoadLevel));   
101                                        }
102                                }
103                        }
104                }
105                return powerConsumption;
106        }
107       
108        @Override
109        public double estimateTemperature(ResourceEvent event, JobRegistry jobRegistry, PhysicalResource resource) {
110                double future = -1;
111
112                Processor cpu = (Processor) resource;
113
114                double R = 0;
115                double Rb = 0;
116                double Rcv = 0;
117                try{
118                        Rb = Double.valueOf(cpu.getPowerInterface().getParameters().get("thermalResistance").get(0).getContent()).doubleValue();
119                } catch (Exception e){
120                        //
121                }
122               
123                double k = 0;
124                try{
125                        k = Double.valueOf(cpu.getPowerInterface().getParameters().get("k").get(0).getContent()).doubleValue();
126                } catch (Exception e){
127                        //
128                }
129               
130                double a = 0;
131                try{
132                        a = Double.valueOf(cpu.getPowerInterface().getParameters().get("a").get(0).getContent()).doubleValue();
133                } catch (Exception e){
134                        a = 1;
135                }
136
137                double V = 0;
138       
139                //System.out.println("------ " + cpu.getFullName());
140                for(Device device: cpu.getParent().getParent().getResourceCharacteristic().getDevices()){
141                        if(device.getType().equals(StandardResourceType.Fan)){
142                                int fanId = Integer.valueOf(device.getName().split("_")[1]).intValue();
143                                int nodeId = Integer.valueOf(cpu.getParent().getName().split("_")[1]).intValue();
144                                //System.out.println(device.getName() + "; " + cpu.getParent().getName());
145                                //System.out.println(fanId + "; " + cpuId);
146                                if(nodeId > (fanId - 1) * EnvironmentConditions.NODES_IN_A_COLUMN && nodeId <= fanId * EnvironmentConditions.NODES_IN_A_COLUMN /*|| Integer.valueOf(device.getName().split("_")[1]) == Integer.valueOf(cpu.getParent().getName().split("_")[1]) - EnvironmentConditions.NODES_IN_A_ROW*/){
147                                        //System.out.println("********");
148                                        Fan fan = (Fan) device;
149                                        V = fan.getAirflowInterface().getRecentAirflow().getValue();
150                                        break;
151                                }
152                        }
153                }
154                //System.out.println("V: " + V);
155                Rcv =  1/ (k * Math.pow(V, a));
156                R = Rb + Rcv;
157                double C = 0;
158                try{
159                        C = Double.valueOf(cpu.getPowerInterface().getParameters().get("thermalCapacity").get(0).getContent()).doubleValue();
160                } catch (Exception e){
161                        //
162                }
163                // 1) look where we are
164                double delta_t = Sim_system.clock() - timestamp;
165                /***************model1*************/
166                //new_temperature = objective_temperature - (objective_temperature - old_temperature) * Math.exp(-delta_t/sink);
167               
168                /***************model2*************/
169                //new_temperature = objective_temperature - (objective_temperature - old_temperature) * Math.exp(-delta_t/(R * C));
170                 
171
172                // 2) calculate if fan is needed ?
173                if(new_temperature <= EnvironmentConditions.TFanLow) {
174                        fan = false;
175                }
176                if(new_temperature >= EnvironmentConditions.TFanHigh) {
177                        fan = true;
178                }
179               
180                // 3) compute new objective
181                double Tin = EnvironmentConditions.ROOM_TEMPERATURE;
182                double Pcpu = cpu.getPowerInterface().getRecentPowerUsage().getValue();
183                new_temperature = objective_temperature - (objective_temperature - old_temperature) * Math.exp(-delta_t/(R * C));
184                //new_temperature = (Pcpu * R + Tin) - (Pcpu * R + Tin - Tidle) * Math.exp(-Sim_system.clock()/(R * C));;
185               
186                //System.out.println("getting inlet...: ");
187                NodeGroup ng = (NodeGroup) cpu.getParent().getParent();
188                for(Node n: ng.getNodes()){
189                        int cpuNodeId = Integer.valueOf(cpu.getParent().getName().split("_")[1]).intValue();
190                        int nodeId = Integer.valueOf(n.getName().split("_")[1]).intValue();
191                        //System.out.println(cpuNodeId + "; " + nodeId);
192                        if(nodeId - cpuNodeId == 1 && (cpuNodeId - 1)/3 == (nodeId - 1)/3){
193                                if(n.getThermalInterface().getRecentTemperature().getValue() == 0){
194                                        Tin = EnvironmentConditions.i5_nodeTidle;
195                                } else
196                                        Tin = n.getThermalInterface().getRecentTemperature().getValue();
197                                //System.out.println("======" + cpu.getFullName() + " previous node: " + n.getFullName() + "; " + Tin);
198                                break;
199                        }
200                }
201                if(cpu.getThermalInterface().getRecentTemperature().getValue() == 0)
202                        Tin = (2 * Tin + EnvironmentConditions.i5_cpuTidle)/3;
203                else
204                        Tin = (2 * Tin + cpu.getThermalInterface().getRecentTemperature().getValue())/3;
205                /***************model1 - GEO1*************/
206                //double cpuLoad = cpu.getLoadInterface().getRecentUtilization().getValue();
207                //double targetTemp = Tidle + cpuLoad/100 * dTfull;
208                //if(fan) {
209                //      targetTemp = targetTemp - dTfan;
210                //}
211               
212               
213                /***************model2 - GEO2*************/
214                //Node node = (Node) cpu.getParent();
215                //Pserv = node.getPowerInterface().getRecentPowerUsage().getValue();
216                //double targetTemp = Pcpu * R + Tin;
217               
218                /***************model3 - GEO1 + GEO2*************/
219                /*double targetTemp = Pcpu * R + Tin;
220                if(fan) {
221                        targetTemp = targetTemp - dTfan;
222                }*/
223       
224                /***************model4 - WP*************/
225                double targetTemp = Pcpu * R + Tin;
226                //System.out.println("----------" + targetTemp +  ": " +  Pcpu +  ": " +  R +  ": " +  Tin);
227                // 4) check if we will need to tune fans
228                if(fan && targetTemp < EnvironmentConditions.TFanLow) {
229                        double timer = C * R * Math.log((new_temperature - targetTemp)/(targetTemp - EnvironmentConditions.TFanLow));
230                        if(future == -1 || future > timer) {
231                                future = timer;
232                        }
233                }
234                if(!fan && targetTemp > EnvironmentConditions.TFanHigh) {
235                        double timer = C * R * Math.log((new_temperature - targetTemp)/(targetTemp - EnvironmentConditions.TFanHigh));
236                        if(future == -1 || future > timer) {
237                                future = timer;
238                        }
239                }
240
241                // 5) save everything
242                timestamp = Sim_system.clock();
243                old_temperature = new_temperature;
244                objective_temperature = targetTemp;
245
246
247                if((future >= 0) && ((next_timer < Sim_system.clock()) || (next_timer >= future + Sim_system.clock()))) {
248                        //DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(future, DCWormsTags.FANMGT, "Test");
249                        next_timer = future + Sim_system.clock() - 0.01;
250                }               
251               
252                if(Sim_system.clock() == 0)
253                        return new_temperature;
254                //DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
255                /*if(new_temperature < EnvironmentConditions.tempLevelMedium2Low){
256                        if(cpu_temp_monitor != 1){
257                                cpu_temp_monitor = 1;
258                                DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
259                        }
260                } else if(new_temperature > EnvironmentConditions.tempLevelMedium2Low && new_temperature < EnvironmentConditions.tempLevelLow2Medium - EnvironmentConditions.tempShift ){
261                        if(cpu_temp_monitor != 2){
262                                cpu_temp_monitor = 2;
263                                DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
264                        }
265                } else if(new_temperature > EnvironmentConditions.tempLevelLow2Medium - EnvironmentConditions.tempShift && new_temperature < EnvironmentConditions.tempLevelHigh2Medium){
266                        if(cpu_temp_monitor != 3){
267                                cpu_temp_monitor = 3;
268                                DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
269                        }
270                } else if(new_temperature > EnvironmentConditions.tempLevelHigh2Medium && new_temperature < EnvironmentConditions.tempLevelMedium2High - EnvironmentConditions.tempShift ){
271                        if(cpu_temp_monitor != 4){
272                                cpu_temp_monitor = 4;
273                                DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
274                        }
275                } else if(new_temperature > EnvironmentConditions.tempLevelMedium2High - EnvironmentConditions.tempShift  && new_temperature < EnvironmentConditions.tempLevelMax2High){
276                        if(cpu_temp_monitor != 5){
277                                cpu_temp_monitor = 5;
278                                DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
279                        }
280                } else if(new_temperature > EnvironmentConditions.tempLevelMax2High && new_temperature < EnvironmentConditions.tempLevelHigh2Max - EnvironmentConditions.tempShift ){
281                        if(cpu_temp_monitor != 6){
282                                cpu_temp_monitor = 6;
283                                DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
284                        }
285                } else if(new_temperature > EnvironmentConditions.tempLevelHigh2Max - EnvironmentConditions.tempShift ){
286                        if(cpu_temp_monitor != 7){
287                                cpu_temp_monitor = 7;
288                                DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
289                        }
290                }*/
291                DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.RESOURCE_TEMPERATURE_LIMIT_EXCEEDED, resource.getFullName());
292                //System.out.println("cpu temp:" + new_temperature);
293                return new_temperature;
294        }
295}
Note: See TracBrowser for help on using the repository browser.