summaryrefslogtreecommitdiff
path: root/opendc-compute
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-compute')
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java16
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/provisioner/HostsProvisioningStep.kt7
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/telemetry/ComputeMetricReader.kt4
-rw-r--r--opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt6
-rw-r--r--opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/ClusterSpec.kt2
-rw-r--r--opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/TopologySpecs.kt94
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/WorkloadLoader.kt34
7 files changed, 124 insertions, 39 deletions
diff --git a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java
index aa2c13b9..1fb9c6a2 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java
+++ b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java
@@ -148,8 +148,6 @@ public final class ComputeService implements AutoCloseable {
*/
private final Map<UUID, ServiceTask> taskById = new HashMap<>();
- private final List<ServiceTask> tasks = new ArrayList<>();
-
private final List<ServiceTask> tasksToRemove = new ArrayList<>();
private ComputeMetricReader metricReader;
@@ -265,8 +263,8 @@ public final class ComputeService implements AutoCloseable {
/**
* Return the {@link ServiceTask}s hosted by this service.
*/
- public List<ServiceTask> getTasks() {
- return Collections.unmodifiableList(tasks);
+ public Map<UUID, ServiceTask> getTasks() {
+ return taskById;
}
/**
@@ -433,7 +431,6 @@ public final class ComputeService implements AutoCloseable {
void delete(ServiceTask task) {
completedTasks.remove(task);
taskById.remove(task.getUid());
- tasks.remove(task);
}
/**
@@ -452,7 +449,6 @@ public final class ComputeService implements AutoCloseable {
* Run a single scheduling iteration.
*/
private void doSchedule() {
- // reorder tasks
for (Iterator<SchedulingRequest> iterator = taskQueue.iterator();
iterator.hasNext();
@@ -660,7 +656,6 @@ public final class ComputeService implements AutoCloseable {
ServiceTask task = new ServiceTask(service, uid, name, internalFlavor, workload, meta);
service.taskById.put(uid, task);
- service.tasks.add(task);
service.tasksTotal++;
@@ -675,13 +670,6 @@ public final class ComputeService implements AutoCloseable {
return service.taskById.get(id);
}
- @NotNull
- public List<ServiceTask> queryTasks() {
- checkOpen();
-
- return new ArrayList<>(service.tasks);
- }
-
public void close() {
isClosed = true;
}
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/provisioner/HostsProvisioningStep.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/provisioner/HostsProvisioningStep.kt
index 68395fe4..211f33fe 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/provisioner/HostsProvisioningStep.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/provisioner/HostsProvisioningStep.kt
@@ -27,11 +27,11 @@ import org.opendc.compute.simulator.host.SimHost
import org.opendc.compute.simulator.service.ComputeService
import org.opendc.compute.topology.specs.ClusterSpec
import org.opendc.compute.topology.specs.HostSpec
+import org.opendc.compute.topology.specs.createSimBatteryPolicy
import org.opendc.simulator.compute.power.CarbonModel
import org.opendc.simulator.compute.power.SimPowerSource
import org.opendc.simulator.compute.power.batteries.BatteryAggregator
import org.opendc.simulator.compute.power.batteries.SimBattery
-import org.opendc.simulator.compute.power.batteries.policy.SingleThresholdBatteryPolicy
import org.opendc.simulator.engine.engine.FlowEngine
import org.opendc.simulator.engine.graph.FlowDistributor
@@ -99,13 +99,12 @@ public class HostsProvisioningStep internal constructor(
// Create Aggregator
val batteryAggregator = BatteryAggregator(graph, battery, batteryDistributor)
- // Create BatteryPolicy
val batteryPolicy =
- SingleThresholdBatteryPolicy(
+ createSimBatteryPolicy(
+ cluster.battery!!.batteryPolicy,
graph,
battery,
batteryAggregator,
- cluster.battery!!.batteryPolicy.carbonThreshold,
)
carbonModel?.addReceiver(batteryPolicy)
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/telemetry/ComputeMetricReader.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/telemetry/ComputeMetricReader.kt
index 91748454..c88b98ea 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/telemetry/ComputeMetricReader.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/telemetry/ComputeMetricReader.kt
@@ -140,7 +140,7 @@ public class ComputeMetricReader(
}
if (toMonitor[OutputFiles.TASK] == true) {
- for (task in this.service.tasks) {
+ for (task in this.service.tasks.values) {
val reader =
this.taskTableReaders.computeIfAbsent(task) {
TaskTableReaderImpl(
@@ -197,7 +197,7 @@ public class ComputeMetricReader(
monitor.record(this.serviceTableReader.copy())
}
- if (loggCounter >= 100) {
+ if (loggCounter >= 24) {
var loggString = "\n\t\t\t\t\tMetrics after ${now.toEpochMilli() / 1000 / 60 / 60} hours:\n"
loggString += "\t\t\t\t\t\tTasks Total: ${this.serviceTableReader.tasksTotal}\n"
loggString += "\t\t\t\t\t\tTasks Active: ${this.serviceTableReader.tasksActive}\n"
diff --git a/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt b/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt
index b62c457c..a20bc2c2 100644
--- a/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt
+++ b/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt
@@ -24,7 +24,7 @@
package org.opendc.compute.topology
-import org.opendc.compute.topology.specs.BatterySpec
+import org.opendc.compute.topology.specs.BatteryJSONSpec
import org.opendc.compute.topology.specs.ClusterJSONSpec
import org.opendc.compute.topology.specs.ClusterSpec
import org.opendc.compute.topology.specs.HostJSONSpec
@@ -134,10 +134,10 @@ private fun ClusterJSONSpec.toClusterSpec(): ClusterSpec {
carbonTracePath = this.powerSource.carbonTracePath,
)
- var batterySpec: BatterySpec? = null
+ var batterySpec: BatteryJSONSpec? = null
if (this.battery != null) {
batterySpec =
- BatterySpec(
+ BatteryJSONSpec(
createUniqueName(this.battery.name, batteryNames),
this.battery.capacity,
this.battery.chargingSpeed,
diff --git a/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/ClusterSpec.kt b/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/ClusterSpec.kt
index 6e7c8dfa..97e12637 100644
--- a/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/ClusterSpec.kt
+++ b/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/ClusterSpec.kt
@@ -26,5 +26,5 @@ public data class ClusterSpec(
val name: String,
val hostSpecs: List<HostSpec>,
val powerSource: PowerSourceSpec,
- val battery: BatterySpec? = null,
+ val battery: BatteryJSONSpec? = null,
)
diff --git a/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/TopologySpecs.kt b/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/TopologySpecs.kt
index 7b309bc3..3d8b63dc 100644
--- a/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/TopologySpecs.kt
+++ b/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/specs/TopologySpecs.kt
@@ -22,10 +22,19 @@
package org.opendc.compute.topology.specs
+import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import org.opendc.common.units.DataSize
import org.opendc.common.units.Frequency
import org.opendc.common.units.Power
+import org.opendc.simulator.compute.power.batteries.BatteryAggregator
+import org.opendc.simulator.compute.power.batteries.SimBattery
+import org.opendc.simulator.compute.power.batteries.policy.BatteryPolicy
+import org.opendc.simulator.compute.power.batteries.policy.DoubleThresholdBatteryPolicy
+import org.opendc.simulator.compute.power.batteries.policy.RunningMeanBatteryPolicy
+import org.opendc.simulator.compute.power.batteries.policy.RunningMeanPlusBatteryPolicy
+import org.opendc.simulator.compute.power.batteries.policy.SingleThresholdBatteryPolicy
+import org.opendc.simulator.engine.graph.FlowGraph
/**
* Definition of a Topology modeled in the simulation.
@@ -182,6 +191,87 @@ public data class BatteryJSONSpec(
)
@Serializable
-public data class BatteryPolicyJSONSpec(
+public sealed interface BatteryPolicyJSONSpec
+
+@Serializable
+@SerialName("single")
+public data class SingleBatteryPolicyJSONSpec(
val carbonThreshold: Double,
-)
+) : BatteryPolicyJSONSpec
+
+@Serializable
+@SerialName("double")
+public data class DoubleBatteryPolicyJSONSpec(
+ val lowerThreshold: Double,
+ val upperThreshold: Double,
+) : BatteryPolicyJSONSpec
+
+@Serializable
+@SerialName("runningMean")
+public data class RunningMeanPolicyJSONSpec(
+ val startingThreshold: Double,
+ val windowSize: Int,
+) : BatteryPolicyJSONSpec
+
+@Serializable
+@SerialName("runningMeanPlus")
+public data class RunningMeanPlusPolicyJSONSpec(
+ val startingThreshold: Double,
+ val windowSize: Int,
+) : BatteryPolicyJSONSpec
+
+@Serializable
+@SerialName("runningMedian")
+public data class RunningMedianPolicyJSONSpec(
+ val startingThreshold: Double,
+ val windowSize: Int,
+) : BatteryPolicyJSONSpec
+
+@Serializable
+@SerialName("runningQuartiles")
+public data class RunningQuartilesPolicyJSONSpec(
+ val startingThreshold: Double,
+ val windowSize: Int,
+) : BatteryPolicyJSONSpec
+
+public fun createSimBatteryPolicy(
+ batterySpec: BatteryPolicyJSONSpec,
+ graph: FlowGraph,
+ battery: SimBattery,
+ batteryAggregator: BatteryAggregator,
+): BatteryPolicy {
+ return when (batterySpec) {
+ is SingleBatteryPolicyJSONSpec ->
+ SingleThresholdBatteryPolicy(
+ graph,
+ battery,
+ batteryAggregator,
+ batterySpec.carbonThreshold,
+ )
+ is DoubleBatteryPolicyJSONSpec ->
+ DoubleThresholdBatteryPolicy(
+ graph,
+ battery,
+ batteryAggregator,
+ batterySpec.lowerThreshold,
+ batterySpec.upperThreshold,
+ )
+ is RunningMeanPolicyJSONSpec ->
+ RunningMeanBatteryPolicy(
+ graph,
+ battery,
+ batteryAggregator,
+ batterySpec.startingThreshold,
+ batterySpec.windowSize,
+ )
+ is RunningMeanPlusPolicyJSONSpec ->
+ RunningMeanPlusBatteryPolicy(
+ graph,
+ battery,
+ batteryAggregator,
+ batterySpec.startingThreshold,
+ batterySpec.windowSize,
+ )
+ else -> throw IllegalArgumentException("Unknown battery policy")
+ }
+}
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/WorkloadLoader.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/WorkloadLoader.kt
index 0b551a3c..ecb98ba2 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/WorkloadLoader.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/WorkloadLoader.kt
@@ -54,9 +54,9 @@ public abstract class WorkloadLoader(private val submissionTime: String? = null)
reScheduleTasks(workload)
- if (fraction >= 1.0) {
- return workload
- }
+// if (fraction >= 1.0) {
+// return workload
+// }
if (fraction <= 0.0) {
throw Error("The fraction of tasks to load cannot be 0.0 or lower")
@@ -65,21 +65,29 @@ public abstract class WorkloadLoader(private val submissionTime: String? = null)
val res = mutableListOf<Task>()
val totalLoad = workload.sumOf { it.totalLoad }
+ val desiredLoad = totalLoad * fraction
var currentLoad = 0.0
- val shuffledWorkload = workload.shuffled()
- for (entry in shuffledWorkload) {
- val entryLoad = entry.totalLoad
-
- // TODO: ask Sacheen
- if ((currentLoad + entryLoad) / totalLoad > fraction) {
- break
- }
-
- currentLoad += entryLoad
+ while (currentLoad < desiredLoad) {
+ val entry = workload.random()
res += entry
+
+ currentLoad += entry.totalLoad
}
+// val shuffledWorkload = workload.shuffled()
+// for (entry in shuffledWorkload) {
+// val entryLoad = entry.totalLoad
+//
+// // TODO: ask Sacheen
+// if ((currentLoad + entryLoad) / totalLoad > fraction) {
+// break
+// }
+//
+// currentLoad += entryLoad
+// res += entry
+// }
+
logger.info { "Sampled ${workload.size} VMs (fraction $fraction) into subset of ${res.size} VMs" }
return res