summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-06-20 22:21:39 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-06-21 12:19:42 +0200
commitdf3c9dc3fcd2f89910575bfdc24a3db3af9eba0f (patch)
tree136246812bbf7b6063aa7b324397d580a1669dff
parentb8b0f39028af90fa54b42a00214b2ea9a5e48e2e (diff)
exp: Enable interpreter sharing across hosts
This change enables the experiments to share the SimResourceInterpreter across multiple hosts, which allows updates to be scheduled efficiently for all machines at the same time. This is especially beneficial if the machines operate on the same time slices.
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt11
-rw-r--r--opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt4
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/ExperimentHelpers.kt4
-rw-r--r--opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt4
-rw-r--r--opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceIntegrationTest.kt4
5 files changed, 15 insertions, 12 deletions
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
index 540e27fe..557fa97a 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
@@ -56,7 +56,7 @@ public class SimHost(
model: SimMachineModel,
override val meta: Map<String, Any>,
context: CoroutineContext,
- clock: Clock,
+ interpreter: SimResourceInterpreter,
meter: Meter,
hypervisor: SimHypervisorProvider,
scalingGovernor: ScalingGovernor,
@@ -70,12 +70,12 @@ public class SimHost(
model: SimMachineModel,
meta: Map<String, Any>,
context: CoroutineContext,
- clock: Clock,
+ interpreter: SimResourceInterpreter,
meter: Meter,
hypervisor: SimHypervisorProvider,
powerModel: PowerModel = ConstantPowerModel(0.0),
mapper: SimWorkloadMapper = SimMetaWorkloadMapper(),
- ) : this(uid, name, model, meta, context, clock, meter, hypervisor, PerformanceScalingGovernor(), SimplePowerDriver(powerModel), mapper)
+ ) : this(uid, name, model, meta, context, interpreter, meter, hypervisor, PerformanceScalingGovernor(), SimplePowerDriver(powerModel), mapper)
/**
* The [CoroutineScope] of the host bounded by the lifecycle of the host.
@@ -98,11 +98,6 @@ public class SimHost(
private var availableMemory: Long = model.memory.sumOf { it.size }
/**
- * The resource interpreter to schedule the resource interactions.
- */
- private val interpreter = SimResourceInterpreter(context, clock)
-
- /**
* The machine to run on.
*/
public val machine: SimBareMetalMachine = SimBareMetalMachine(interpreter, model, scalingDriver)
diff --git a/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt b/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
index a6cff3ba..79489fdb 100644
--- a/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
+++ b/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
@@ -47,6 +47,7 @@ import org.opendc.simulator.compute.model.ProcessingNode
import org.opendc.simulator.compute.model.ProcessingUnit
import org.opendc.simulator.compute.workload.SimTraceWorkload
import org.opendc.simulator.core.runBlockingSimulation
+import org.opendc.simulator.resources.SimResourceInterpreter
import org.opendc.telemetry.sdk.metrics.export.CoroutineMetricReader
import org.opendc.telemetry.sdk.toOtelClock
import java.util.UUID
@@ -83,7 +84,8 @@ internal class SimHostTest {
.setClock(clock.toOtelClock())
.build()
- val virtDriver = SimHost(UUID.randomUUID(), "test", machineModel, emptyMap(), coroutineContext, clock, meterProvider.get("opendc-compute-simulator"), SimFairShareHypervisorProvider())
+ val interpreter = SimResourceInterpreter(coroutineContext, clock)
+ val virtDriver = SimHost(UUID.randomUUID(), "test", machineModel, emptyMap(), coroutineContext, interpreter, meterProvider.get("opendc-compute-simulator"), SimFairShareHypervisorProvider())
val duration = 5 * 60L
val vmImageA = MockImage(
UUID.randomUUID(),
diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/ExperimentHelpers.kt b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/ExperimentHelpers.kt
index 0fbb7280..0485415c 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/ExperimentHelpers.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/ExperimentHelpers.kt
@@ -50,6 +50,7 @@ import org.opendc.simulator.compute.workload.SimTraceWorkload
import org.opendc.simulator.compute.workload.SimWorkload
import org.opendc.simulator.failures.CorrelatedFaultInjector
import org.opendc.simulator.failures.FaultInjector
+import org.opendc.simulator.resources.SimResourceInterpreter
import org.opendc.telemetry.sdk.metrics.export.CoroutineMetricReader
import org.opendc.telemetry.sdk.toOtelClock
import java.io.File
@@ -144,6 +145,7 @@ public suspend fun withComputeService(
scheduler: ComputeScheduler,
block: suspend CoroutineScope.(ComputeService) -> Unit
): Unit = coroutineScope {
+ val interpreter = SimResourceInterpreter(coroutineContext, clock)
val hosts = environmentReader
.use { it.read() }
.map { def ->
@@ -153,7 +155,7 @@ public suspend fun withComputeService(
def.model,
def.meta,
coroutineContext,
- clock,
+ interpreter,
meterProvider.get("opendc-compute-simulator"),
SimFairShareHypervisorProvider(),
def.powerModel
diff --git a/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt b/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt
index 65915cc6..2f14776a 100644
--- a/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt
+++ b/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt
@@ -49,6 +49,7 @@ import org.opendc.simulator.compute.model.ProcessingNode
import org.opendc.simulator.compute.model.ProcessingUnit
import org.opendc.simulator.compute.power.*
import org.opendc.simulator.core.runBlockingSimulation
+import org.opendc.simulator.resources.SimResourceInterpreter
import java.io.File
import java.time.Clock
import java.util.*
@@ -120,6 +121,7 @@ public class EnergyExperiment : Experiment("Energy Modeling 2021") {
block: suspend CoroutineScope.(ComputeService) -> Unit
): Unit = coroutineScope {
val model = createMachineModel()
+ val interpreter = SimResourceInterpreter(coroutineContext, clock)
val hosts = List(64) { id ->
SimHost(
UUID(0, id.toLong()),
@@ -127,7 +129,7 @@ public class EnergyExperiment : Experiment("Energy Modeling 2021") {
model,
emptyMap(),
coroutineContext,
- clock,
+ interpreter,
meterProvider.get("opendc-compute-simulator"),
SimFairShareHypervisorProvider(),
PerformanceScalingGovernor(),
diff --git a/opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceIntegrationTest.kt b/opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceIntegrationTest.kt
index a8d3a9e8..6807572b 100644
--- a/opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceIntegrationTest.kt
+++ b/opendc-workflow/opendc-workflow-service/src/test/kotlin/org/opendc/workflow/service/WorkflowServiceIntegrationTest.kt
@@ -43,6 +43,7 @@ import org.opendc.format.environment.sc18.Sc18EnvironmentReader
import org.opendc.format.trace.gwf.GwfTraceReader
import org.opendc.simulator.compute.SimSpaceSharedHypervisorProvider
import org.opendc.simulator.core.runBlockingSimulation
+import org.opendc.simulator.resources.SimResourceInterpreter
import org.opendc.telemetry.sdk.toOtelClock
import org.opendc.workflow.service.internal.WorkflowServiceImpl
import org.opendc.workflow.service.scheduler.WorkflowSchedulerMode
@@ -68,6 +69,7 @@ internal class WorkflowServiceIntegrationTest {
.setClock(clock.toOtelClock())
.build()
+ val interpreter = SimResourceInterpreter(coroutineContext, clock)
val hosts = Sc18EnvironmentReader(object {}.javaClass.getResourceAsStream("/environment.json"))
.use { it.read() }
.map { def ->
@@ -77,7 +79,7 @@ internal class WorkflowServiceIntegrationTest {
def.model,
def.meta,
coroutineContext,
- clock,
+ interpreter,
MeterProvider.noop().get("opendc-compute-simulator"),
SimSpaceSharedHypervisorProvider()
)