source: DCWoRMS/branches/coolemall/src/experiments/simpat2014/models/article/FCFSBF_RandomPluginMigrate.java @ 1583

Revision 1583, 10.6 KB checked in by wojtekp, 9 years ago (diff)
Line 
1package experiments.simpat2014.models.article;
2
3import java.util.ArrayList;
4import java.util.HashMap;
5import java.util.List;
6import java.util.Map;
7import java.util.Random;
8
9import schedframe.events.scheduling.SchedulingEvent;
10import schedframe.events.scheduling.TaskFinishedEvent;
11import schedframe.resources.ResourceStatus;
12import schedframe.resources.StandardResourceType;
13import schedframe.resources.computing.ComputingResource;
14import schedframe.resources.computing.Core;
15import schedframe.resources.computing.Node;
16import schedframe.resources.computing.Processor;
17import schedframe.resources.computing.profiles.energy.ResourceEvent;
18import schedframe.resources.computing.profiles.energy.ResourceEventType;
19import schedframe.resources.computing.profiles.energy.airthroughput.CustomAirflowStateName;
20import schedframe.resources.computing.profiles.energy.power.CustomPowerStateName;
21import schedframe.resources.computing.profiles.energy.power.PowerState;
22import schedframe.resources.computing.profiles.energy.power.PowerUsage;
23import schedframe.resources.devices.Device;
24import schedframe.resources.devices.Fan;
25import schedframe.resources.units.ProcessingElements;
26import schedframe.resources.units.ResourceUnit;
27import schedframe.resources.units.ResourceUnitName;
28import schedframe.resources.units.StandardResourceUnitName;
29import schedframe.scheduling.ResourceItem;
30import schedframe.scheduling.manager.resources.ClusterResourceManager;
31import schedframe.scheduling.manager.resources.ResourceManager;
32import schedframe.scheduling.manager.tasks.JobRegistry;
33import schedframe.scheduling.manager.tasks.JobRegistryImpl;
34import schedframe.scheduling.plan.SchedulingPlanInterface;
35import schedframe.scheduling.plan.impl.SchedulingPlan;
36import schedframe.scheduling.plugin.ModuleList;
37import schedframe.scheduling.queue.TaskQueue;
38import schedframe.scheduling.queue.TaskQueueList;
39import schedframe.scheduling.tasks.TaskInterface;
40import simulator.DataCenterWorkloadSimulator;
41import dcworms.schedframe.scheduling.ExecTask;
42import eduni.simjava.Sim_system;
43import example.localplugin.BaseLocalSchedulingPlugin;
44import experiments.simpat2014.EnvironmentConditions;
45import gridsim.dcworms.DCWormsTags;
46
47public class FCFSBF_RandomPluginMigrate extends BaseLocalSchedulingPlugin {
48
49
50        private Random rand;
51       
52        public FCFSBF_RandomPluginMigrate() {
53                rand = new Random(5);
54        }
55        public SchedulingPlanInterface<?> schedule(SchedulingEvent event, TaskQueueList queues, JobRegistry jobRegistry,
56                        ResourceManager resManager, ModuleList modules) {
57
58                ClusterResourceManager resourceManager = (ClusterResourceManager) resManager;
59                List<Node> nodes = resourceManager.getNodes();
60                SchedulingPlan plan = new SchedulingPlan();
61//for(Node node: resourceManager.getNodes()){
62//      System.out.println(node.getFullName());
63//}
64                // choose the events types to serve.
65                // Different actions for different events are possible.
66                switch (event.getType()) {
67               
68               
69                case TIMER:
70
71                        System.out.println("##" + Sim_system.clock());
72                        DataCenterWorkloadSimulator.getEventManager().sendToResources(StandardResourceType.Processor, 0.0, new ResourceEvent(ResourceEventType.TIMER, null));
73                        //DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(EnvironmentConditions.SYSTEM_UDPATE_INTERVAL, DCWormsTags.TIMER, "Test");
74                        break;
75                       
76                case START_TASK_EXECUTION:
77                case TASK_FINISHED:
78
79                        // our tasks are placed only in first queue (see BaseLocalSchedulingPlugin.placeJobsInQueues() method)
80                        TaskQueue q = queues.get(0);
81                        // check all tasks in queue
82
83                        for (int i = 0; i < q.size(); i++) {
84                                TaskInterface<?> task = q.get(i);
85                                // if status of the tasks in READY
86                                if (task.getStatus() == DCWormsTags.READY) {
87                                        Map<ResourceUnitName, ResourceUnit> choosenResources = chooseResourcesForExecution(nodes, task);
88                                        if (choosenResources != null) {
89                                                addToSchedulingPlan(plan, task, choosenResources);
90                                        } 
91                                }
92                        }
93
94                        break;
95                case RESOURCE_TEMPERATURE_LIMIT_EXCEEDED:
96                        manageFans(resourceManager.getResourceByName(event.getSource()));
97                        Node n = resourceManager.getNodes().get(0);
98                        double min_temp = -1;
99                        List<Node> availableNodes = filterNodes(resourceManager.getNodes(), 8);
100                        for(Node node: availableNodes) {
101                                if(min_temp == -1 || min_temp > node.getProcessors().get(0).getThermalInterface().getRecentTemperature().getValue()){
102                                        min_temp = node.getProcessors().get(0).getThermalInterface().getRecentTemperature().getValue();
103                                        n = node;
104                                       
105                                }
106                        }
107
108                        for(Node node: resourceManager.getNodes()) {
109                                if(node.getProcessors().get(0).getThermalInterface().getRecentTemperature().getValue() > 46 && node != n) {
110                                        System.out.println("   ----------------------- OVERHEAT !");
111                                        moveAllTask(jobRegistry, node, n);
112                                        break;
113                                }
114                        }               
115                        //optimizeEnergyUsage(jobRegistry, resourceManager , src);
116                        break;
117
118                }       
119
120                return plan;
121        }
122       
123        private void manageFans(ComputingResource cr ){
124                //System.out.println("tuning fans");
125                double temp = cr.getThermalInterface().getRecentTemperature().getValue();
126                double prevTemp;
127                if(cr.getThermalInterface().getTemperatureHistory().size() == 1)
128                        prevTemp = temp;
129                else {
130                        prevTemp = cr.getThermalInterface().getTemperatureHistory().get(cr.getThermalInterface().getTemperatureHistory().size() - 2).getValue();
131                }
132
133                //System.out.println(prevTemp+  ";  " + temp);
134                boolean getingHotter = prevTemp < temp;
135                boolean getingColder = prevTemp > temp;
136                Node n = (Node) cr.getParent();
137                for(Device d: n.getParent().getResourceCharacteristic().getDevices()){
138                        //System.out.println(d.getName() + "; " + n.getName());
139                        if(Integer.valueOf(d.getName().split("_")[1]).intValue() == Integer.valueOf(n.getName().split("_")[1]).intValue() || Integer.valueOf(d.getName().split("_")[1]).intValue() == Integer.valueOf(n.getName().split("_")[1]).intValue() - EnvironmentConditions.NODES_IN_A_ROW){
140                                Fan f = (Fan) d;
141                                int speed;
142                                try{
143                                        speed= Integer.valueOf(f.getAirflowInterface().getAirflowState().getLabel().split("_")[1]).intValue();
144                                } catch(Exception e){
145                                        speed = 0;
146                                }
147                                if(getingHotter){
148                                        if(temp > EnvironmentConditions.tempLevelLow2Medium && temp < EnvironmentConditions.tempLevelMedium2High){
149                                                if(speed < 60){
150                                                        //System.out.println("+++++++++ low 2 medium");
151                                                        f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_60"));
152                                                }
153                                        } else if (temp > EnvironmentConditions.tempLevelMedium2High && temp < EnvironmentConditions.tempLevelHigh2Max) {
154                                                if(speed < 80){
155                                                        //System.out.println("++++++++medium 2 high");
156                                                        f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_80"));
157                                                }
158                                        } else if (temp > EnvironmentConditions.tempLevelHigh2Max) {
159                                                if(speed < 100){
160                                                        //System.out.println("++++++++high 2 max");
161                                                        f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_100"));
162                                                }
163                                        }                                       
164                                } else if (getingColder){
165                                        if(temp > EnvironmentConditions.tempLevelHigh2Medium && temp < EnvironmentConditions.tempLevelMax2High){
166                                                if(speed == 100){
167                                                        //System.out.println("-------- max 2 high");
168                                                        f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_80"));
169                                                }
170                                        } else if(temp > EnvironmentConditions.tempLevelMedium2Low && temp < EnvironmentConditions.tempLevelHigh2Medium){
171                                                if(speed >= 80){
172                                                        //System.out.println("-------- high 2 medium");
173                                                        f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_60"));           
174                                                }
175                                        } else if (temp < EnvironmentConditions.tempLevelMedium2Low) {
176                                                if(speed >= 60){
177                                                        //System.out.println("-------- medium 2 low");
178                                                        f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_30"));   
179                                                }
180                                        }
181                                }
182                        }
183                }
184        }
185
186        private void moveAllTask(JobRegistry jobRegistry, Node source, Node dest) {
187                double totalLoad = source.getLoadInterface().getRecentUtilization().getValue()+dest.getLoadInterface().getRecentUtilization().getValue();
188                if(totalLoad>100) {return;}
189               
190                JobRegistry srcHostJr = new JobRegistryImpl(source.getFullName());
191                int runningTasksNumber = srcHostJr.getRunningTasks().size();
192                for(int i=runningTasksNumber-1; i>=0; i--) {
193                        ExecTask execTask = srcHostJr.getRunningTasks().get(i);
194                        List<Node> nodes = new ArrayList<Node>();
195                        nodes.add(dest);
196                        Map<ResourceUnitName, ResourceUnit> destinationResources = chooseResourcesForExecution(nodes, execTask);
197                        jobRegistry.migrateTask(execTask.getJobId(), execTask.getId(), destinationResources);
198                }
199        }
200
201        private Map<ResourceUnitName, ResourceUnit> chooseResourcesForExecution(
202                        List<Node> nodes, TaskInterface<?> task) {
203
204                Map<ResourceUnitName, ResourceUnit> map = new HashMap<ResourceUnitName, ResourceUnit>(1);
205
206                int cpuRequest;
207                try {
208                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
209                } catch (NoSuchFieldException e) {
210                        cpuRequest = 0;
211                }
212
213                List<Node> filteredNodes = filterNodes(nodes, cpuRequest);
214                if(filteredNodes.size()==0)
215                        return null;
216                Node node = chooseRandomNode(filteredNodes);
217                while(node.getFreeCores().size() < cpuRequest){
218                        node = chooseRandomNode(nodes);
219                }
220               
221                if (cpuRequest != 0) {
222
223                        if (node.getFreeCores().size() < cpuRequest) {
224                                return null;
225                        }
226
227                        List<Processor>  processors = node.getProcessors();
228                        List<Core> cores = node.getCores();
229                        List<ComputingResource> choosenResources = new ArrayList<ComputingResource>(cpuRequest);                               
230                        for (int i = 0; i < cores.size() && cpuRequest > 0; i++) {
231                                if (cores.get(i).getStatus() == ResourceStatus.FREE) {
232                                        choosenResources.add(cores.get(i));
233                                        cpuRequest--;
234                                }
235                        }
236                        if (cpuRequest > 0) {
237                                return null;
238                        }
239
240                        ProcessingElements pe = new ProcessingElements();
241                        pe.addAll(choosenResources);
242                        map.put(StandardResourceUnitName.PE, pe);
243                        return map;
244                }
245
246                return null;
247        }
248
249       
250        private List<Node> filterNodes(List<Node> nodes, int cpuRequest){
251                List<Node> filteredNodes = new ArrayList<Node>();
252
253                for (Node node : nodes) {
254
255                        if (cpuRequest != 0) {
256
257                                List<Core> cores = node.getCores();
258                                if (cores.size() < cpuRequest) {
259                                        if(cores.size() == 0){
260                                                if(node.getProcessors().size() < cpuRequest)
261                                                        continue;
262                                        }
263                                }
264
265                                int freeCores = 0;
266                                for(Core core: cores){
267                                        if(core.getStatus() == ResourceStatus.FREE)
268                                                freeCores++;
269                                }
270                               
271                                if(freeCores < cpuRequest)
272                                        continue;
273                               
274                                filteredNodes.add(node);
275                        }
276                }
277               
278                return filteredNodes;
279        }
280       
281
282        private Node chooseRandomNode(List<Node> nodes) {
283                int nodeIdx = rand.nextInt(nodes.size());
284                return nodes.get(nodeIdx);
285        }
286}
287
Note: See TracBrowser for help on using the repository browser.