package experiments.simpat2014.models.basic; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import schedframe.events.scheduling.SchedulingEvent; import schedframe.events.scheduling.TaskFinishedEvent; import schedframe.resources.ResourceStatus; import schedframe.resources.StandardResourceType; import schedframe.resources.computing.ComputingResource; import schedframe.resources.computing.Node; import schedframe.resources.computing.Processor; import schedframe.resources.computing.profiles.energy.ResourceEvent; import schedframe.resources.computing.profiles.energy.ResourceEventType; import schedframe.resources.computing.profiles.energy.airthroughput.AirflowStateName; import schedframe.resources.computing.profiles.energy.airthroughput.CustomAirflowStateName; import schedframe.resources.computing.profiles.energy.power.CustomPowerStateName; import schedframe.resources.computing.profiles.energy.power.PowerState; import schedframe.resources.computing.profiles.energy.power.PowerUsage; import schedframe.resources.devices.Device; import schedframe.resources.devices.Fan; import schedframe.resources.units.ProcessingElements; import schedframe.resources.units.ResourceUnit; import schedframe.resources.units.ResourceUnitName; import schedframe.resources.units.StandardResourceUnitName; import schedframe.scheduling.ResourceItem; import schedframe.scheduling.manager.resources.ClusterResourceManager; import schedframe.scheduling.manager.resources.ResourceManager; import schedframe.scheduling.manager.tasks.JobRegistry; import schedframe.scheduling.manager.tasks.JobRegistryImpl; import schedframe.scheduling.plan.SchedulingPlanInterface; import schedframe.scheduling.plan.impl.SchedulingPlan; import schedframe.scheduling.plugin.ModuleList; import schedframe.scheduling.queue.TaskQueue; import schedframe.scheduling.queue.TaskQueueList; import schedframe.scheduling.tasks.TaskInterface; import simulator.DataCenterWorkloadSimulator; import dcworms.schedframe.scheduling.ExecTask; import eduni.simjava.Sim_system; import example.localplugin.BaseLocalSchedulingPlugin; import experiments.simpat2014.EnvironmentConditions; import gridsim.dcworms.DCWormsTags; public class FCFSBF_RandomPluginMigrate extends BaseLocalSchedulingPlugin { public SchedulingPlanInterface schedule(SchedulingEvent event, TaskQueueList queues, JobRegistry jobRegistry, ResourceManager resManager, ModuleList modules) { ClusterResourceManager resourceManager = (ClusterResourceManager) resManager; List processors = resourceManager.getProcessors(); SchedulingPlan plan = new SchedulingPlan(); //for(Node node: resourceManager.getNodes()){ // System.out.println(node.getFullName()); //} // choose the events types to serve. // Different actions for different events are possible. switch (event.getType()) { case TIMER: System.out.println("##########################" + Sim_system.clock()); DataCenterWorkloadSimulator.getEventManager().sendToResources(StandardResourceType.Processor, 0.0, new ResourceEvent(ResourceEventType.TIMER, null)); //DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(EnvironmentConditions.SYSTEM_UDPATE_INTERVAL, DCWormsTags.TIMER, "Test"); break; case START_TASK_EXECUTION: case TASK_FINISHED: // our tasks are placed only in first queue (see BaseLocalSchedulingPlugin.placeJobsInQueues() method) TaskQueue q = queues.get(0); // check all tasks in queue for (int i = 0; i < q.size(); i++) { TaskInterface task = q.get(i); // if status of the tasks in READY if (task.getStatus() == DCWormsTags.READY) { Map choosenResources = chooseResourcesForExecution(processors, task); if (choosenResources != null) { addToSchedulingPlan(plan, task, choosenResources); } } } break; case RESOURCE_TEMPERATURE_LIMIT_EXCEEDED: System.out.println("tuning fans"); ComputingResource cr = resourceManager.getResourceByName(event.getSource()); double temp = cr.getThermalInterface().getRecentTemperature().getValue(); double prevTemp; if(cr.getThermalInterface().getTemperatureHistory().size() == 1) prevTemp = temp; else { prevTemp = cr.getThermalInterface().getTemperatureHistory().get(cr.getThermalInterface().getTemperatureHistory().size() - 2).getValue(); } System.out.println(prevTemp+ "; " + temp); boolean getingHotter = prevTemp < temp; Node n = (Node) cr.getParent(); for(Device d: n.getParent().getResourceCharacteristic().getDevices()){ if(Integer.valueOf(d.getName().split("_")[1]) == Integer.valueOf(n.getName().split("_")[1])){ Fan f = (Fan) d; int speed; try{ speed= Integer.valueOf(f.getAirflowInterface().getAirflowState().getLabel().split("_")[1]).intValue(); } catch(Exception e){ speed = 0; } if(getingHotter){ if(temp > EnvironmentConditions.tempLevelLow2Medium && temp < EnvironmentConditions.tempLevelMedium2High){ if(speed < 60){ System.out.println("+++++++++ low 2 medium"); f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_60")); } } else if (temp > EnvironmentConditions.tempLevelMedium2High && temp < EnvironmentConditions.tempLevelHigh2Max) { if(speed < 80){ System.out.println("++++++++medium 2 high"); f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_80")); } } else if (temp > EnvironmentConditions.tempLevelHigh2Max) { if(speed < 100){ System.out.println("++++++++high 2 max"); f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_100")); } } } else { if(temp > EnvironmentConditions.tempLevelHigh2Medium && temp < EnvironmentConditions.tempLevelMax2High){ System.out.println("-------- max 2 high"); f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_80")); } else if(temp > EnvironmentConditions.tempLevelMedium2Low && temp < EnvironmentConditions.tempLevelHigh2Medium){ System.out.println("-------- high 2 medium"); f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_60")); } else if (temp < EnvironmentConditions.tempLevelMedium2Low) { System.out.println("-------- medium 2 low"); f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_30")); } } } /*AirflowStateName state = f.getAirflowInterface().getAirflowState(); try{ Integer level = Integer.valueOf(state.getLabel().split("_")[1]); Integer newLevel = level + 10; if(newLevel <= 100) f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_" + newLevel)); } catch (Exception e){ f.getAirflowInterface().setAirflowState(new CustomAirflowStateName("ON_10")); } */ } //optimizeEnergyUsage(jobRegistry, resourceManager , src); break; } return plan; } // IRIT private void firstFitConsolidation(JobRegistry jobRegistry, ClusterResourceManager resourceManager, SchedulingEvent event) { Node underLoadedNode = getNodeFromEvent(jobRegistry, (TaskFinishedEvent) event); double remainingLoad = underLoadedNode.getLoadInterface().getRecentUtilization().getValue(); if(remainingLoad == 0) { return; } PowerUsage pow = underLoadedNode.getPowerInterface().getRecentPowerUsage(); System.out.println(" last : "+pow.getValue()); System.out.println(" Estimate : "+getPowerConsumptionAtLoad(underLoadedNode, remainingLoad)); for(Node node: resourceManager.getNodes()) { double destLoad = node.getLoadInterface().getRecentUtilization().getValue(); if((node != underLoadedNode) && (destLoad!=0) && (destLoad + remainingLoad <= 100)) { if(destLoad < remainingLoad) { moveAllTask(jobRegistry, node, underLoadedNode); } else { moveAllTask(jobRegistry, underLoadedNode, node); } return; } } } // IRIT private Node getNodeFromEvent(JobRegistry jobRegistry, TaskFinishedEvent event) { ExecTask task = jobRegistry.getTask(event.getJobId(), event.getTaskId()); ResourceItem r = task.getAllocatedResources().getLast(); ProcessingElements pe = (ProcessingElements) r.getResourceUnits().get(StandardResourceUnitName.PE); ComputingResource c = pe.get(0); return (Node) c.getParent(); } // IRIT private void moveAllTask(JobRegistry jobRegistry, Node source, Node dest) { double totalLoad = source.getLoadInterface().getRecentUtilization().getValue()+dest.getLoadInterface().getRecentUtilization().getValue(); if(totalLoad>100) {return;} JobRegistry srcHostJr = new JobRegistryImpl(source.getFullName()); int runningTasksNumber = srcHostJr.getRunningTasks().size(); for(int i=runningTasksNumber-1; i>=0; i--) { ExecTask execTask = srcHostJr.getRunningTasks().get(i); Map destinationResources = chooseResourcesForExecution(dest.getProcessors(), execTask); jobRegistry.migrateTask(execTask.getJobId(), execTask.getId(), destinationResources); } } // IRIT public double getPowerConsumptionAtLoad(Node node, double loadLevel){ double powerConsumption = 0; double lowestLoadLevel = 100; double highestLoadLevel = 0; System.out.println("ON_" + new Double(loadLevel).intValue()); System.out.println(node.getPowerInterface().supportPowerState(new CustomPowerStateName("ON_50"))); try{ if(node.getPowerInterface().supportPowerState(new CustomPowerStateName("ON_" + new Double(loadLevel).intValue()))){ System.out.println("2 ON_" + new Double(loadLevel).intValue()); powerConsumption = node.getPowerInterface().getPowerConsumption(new CustomPowerStateName("ON_" + new Double(loadLevel).intValue())); } else { for(PowerState powerState: node.getPowerInterface().getSupportedPowerStates()){ Double load; System.out.println(" getname "+powerState.getName().getLabel()); try{ load = Double.valueOf(powerState.getName().getLabel().substring(3)); }catch (Exception e){ continue; } if(lowestLoadLevel > load){ lowestLoadLevel = load; } if(highestLoadLevel < load){ highestLoadLevel = load; } } if(loadLevel == 0){ powerConsumption = node.getPowerInterface().getPowerConsumption(new CustomPowerStateName("ON_0")); } else { double lowerLoadLevel = lowestLoadLevel; double higherLoadLevel = highestLoadLevel; for(PowerState powerState: node.getPowerInterface().getSupportedPowerStates()){ Double load = Double.valueOf(powerState.getName().getLabel().substring(3)); if(loadLevel > load){ lowerLoadLevel = load; } else if(loadLevel < load){ higherLoadLevel = load; break; } } double powerBelow; double powerAbove; double a; double b; if(lowerLoadLevel != higherLoadLevel) { powerBelow = node.getPowerInterface().getPowerConsumption(new CustomPowerStateName("ON_" + new Double(lowerLoadLevel).intValue())); powerAbove = node.getPowerInterface().getPowerConsumption(new CustomPowerStateName("ON_" + new Double(higherLoadLevel).intValue())); a = (powerAbove - powerBelow)/(higherLoadLevel - lowerLoadLevel); b = powerAbove - a * higherLoadLevel; } else { powerBelow = node.getPowerInterface().getPowerConsumption(new CustomPowerStateName("ON_" + new Double(lowestLoadLevel).intValue())); powerAbove = node.getPowerInterface().getPowerConsumption(new CustomPowerStateName("ON_" + new Double(highestLoadLevel).intValue())); a = (powerAbove - powerBelow)/(highestLoadLevel - lowestLoadLevel); b = powerAbove - a * highestLoadLevel; } powerConsumption = a * loadLevel + b; } } } catch (Exception e){ } return powerConsumption; } private void globalEnergyOptimizer(JobRegistry jobRegistry, ClusterResourceManager resourceManager, String resName) { Node leastLoadedNode = findLeastLoadedResource(resourceManager.getNodes()); Node mostLoadedNode = findMostLoadedResource(resourceManager.getNodes()); System.out.println("-------------ALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLERT"); System.out.println(" max : "+mostLoadedNode.getLoadInterface().getRecentUtilization().getValue()); System.out.println(" min : "+leastLoadedNode.getLoadInterface().getRecentUtilization().getValue()); if(leastLoadedNode.getLoadInterface().getRecentUtilization().getValue() >= mostLoadedNode.getLoadInterface().getRecentUtilization().getValue()){ return; } System.out.println(" ALLLLLLLLLLLLLLLL"); if(leastLoadedNode.getLoadInterface().getRecentUtilization().getValue() != 0){ return; } System.out.println(" LLLLLLLLLLLLLLLLLLLLERT"); JobRegistry srcHostJr = new JobRegistryImpl(mostLoadedNode.getFullName()); int runningTasksNumber = srcHostJr.getRunningTasks().size(); System.out.println(" nbtasks source "+runningTasksNumber); if(runningTasksNumber >= 1) { ExecTask execTask = srcHostJr.getRunningTasks().get(0); Map destinationResources = chooseResourcesForExecution(findLeastLoadedResource(resourceManager.getNodes()).getProcessors(), execTask); System.out.println(" "+destinationResources.toString()); jobRegistry.migrateTask(execTask.getJobId(), execTask.getId(), destinationResources); } /*for(int i = srcHostJr.getRunningTasks().size() - 1; i >= 0 && runningTasksNumber > 2; i--) { System.out.println(" Migration"); ExecTask execTask = srcHostJr.getRunningTasks().get(i); Map destinationResources = chooseResourcesForExecution(findLeastLoadedResource(resourceManager.getNodes()).getProcessors(), execTask); System.out.println(" "+destinationResources.toString()); jobRegistry.migrateTask(execTask.getJobId(), execTask.getId(), destinationResources); runningTasksNumber--; } */ } private void optimizeEnergyUsage(JobRegistry jobRegistry, ClusterResourceManager resourceManager, String resName) { Node overLoadedNode = (Node)resourceManager .getResourceByName(resName); Node leastLoadedNode = findLeastLoadedResource(resourceManager.getNodes()); if(leastLoadedNode.getLoadInterface().getRecentUtilization().getValue() >= overLoadedNode.getLoadInterface().getRecentUtilization().getValue()){ return; } JobRegistry srcHostJr = new JobRegistryImpl(overLoadedNode.getFullName()); int runningTasksNumber = srcHostJr.getRunningTasks().size(); for(int i = srcHostJr.getRunningTasks().size() - 1; i >= 0 && runningTasksNumber > 2; i--) { ExecTask execTask = srcHostJr.getRunningTasks().get(i); Map destinationResources = chooseResourcesForExecution(findLeastLoadedResource(resourceManager.getNodes()).getProcessors(), execTask); jobRegistry.migrateTask(execTask.getJobId(), execTask.getId(), destinationResources); runningTasksNumber--; } } private Map chooseResourcesForExecution( List processors, TaskInterface task) { Map map = new HashMap(1); int cpuRequest; try { cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue(); } catch (NoSuchFieldException e) { cpuRequest = 0; } if (cpuRequest != 0) { if (processors.size() < cpuRequest) { return null; } List choosenResources = new ArrayList(cpuRequest); for (int i = 0; i < processors.size() && cpuRequest > 0; i++) { if (processors.get(i).getStatus() == ResourceStatus.FREE) { choosenResources.add(processors.get(i)); cpuRequest--; } } if (cpuRequest > 0) { return null; } ProcessingElements pe = new ProcessingElements(); pe.addAll(choosenResources); map.put(StandardResourceUnitName.PE, pe); return map; } return null; } private Node findLeastLoadedResource(List nodes ){ Node leastLoadedNoded = null; double minLoad = Double.MAX_VALUE; for(int i = 0; i < nodes.size(); i++){ Node node = nodes.get(i); double totalLoad = node.getLoadInterface().getRecentUtilization().getValue(); if(totalLoad < minLoad){ leastLoadedNoded= node; minLoad = totalLoad; } } return leastLoadedNoded; } private Node findMostLoadedResource(List nodes ){ Node mostLoadedNoded = null; double minLoad = 0; for(int i = 0; i < nodes.size(); i++){ Node node = nodes.get(i); double totalLoad = node.getLoadInterface().getRecentUtilization().getValue(); if(totalLoad >= minLoad){ mostLoadedNoded= node; minLoad = totalLoad; } } return mostLoadedNoded; } }