summaryrefslogtreecommitdiff
path: root/opendc-web
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-06-24 12:54:52 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-06-24 13:43:34 +0200
commite56967a29ac2b2d26cc085b1f3e27096dad6a170 (patch)
tree67c09fa437bc9b1f37f23b80b970b6aa686ad818 /opendc-web
parentbe34a55c2c2fe94a6883c6b97d2abe4c43288e8a (diff)
simulator: Re-implement performance interference model
This change updates reimplements the performance interference model to work on top of the universal resource model in `opendc-simulator-resources`. This enables us to model interference and performance variability of other resources such as disk or network in the future.
Diffstat (limited to 'opendc-web')
-rw-r--r--opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/runner/web/Main.kt29
1 files changed, 23 insertions, 6 deletions
diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/runner/web/Main.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/runner/web/Main.kt
index f5d0b65e..d0b97d90 100644
--- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/runner/web/Main.kt
+++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/runner/web/Main.kt
@@ -48,12 +48,15 @@ import org.opendc.compute.service.scheduler.weights.*
import org.opendc.experiments.capelin.*
import org.opendc.experiments.capelin.model.Workload
import org.opendc.experiments.capelin.trace.ParquetTraceReader
+import org.opendc.experiments.capelin.trace.PerformanceInterferenceReader
import org.opendc.experiments.capelin.trace.RawParquetTraceReader
import org.opendc.format.environment.EnvironmentReader
+import org.opendc.simulator.compute.kernel.interference.VmInterferenceModel
import org.opendc.simulator.core.runBlockingSimulation
import org.opendc.telemetry.sdk.toOtelClock
import java.io.File
import kotlin.random.Random
+import kotlin.random.asJavaRandom
private val logger = KotlinLogging.logger {}
@@ -61,7 +64,7 @@ private val logger = KotlinLogging.logger {}
* Represents the CLI command for starting the OpenDC web runner.
*/
@OptIn(ExperimentalCoroutinesApi::class)
-public class RunnerCli : CliktCommand(name = "runner") {
+class RunnerCli : CliktCommand(name = "runner") {
/**
* The name of the database to use.
*/
@@ -167,14 +170,27 @@ public class RunnerCli : CliktCommand(name = "runner") {
scenario.getEmbedded(listOf("trace", "traceId"), String::class.java)
)
val traceReader = RawParquetTraceReader(traceDir)
+ val interferenceGroups = let {
+ val path = File(traceDir, "performance-interference-model.json")
+ val operational = scenario.get("operational", Document::class.java)
+ val enabled = operational.getBoolean("performanceInterferenceEnabled")
+
+ if (!enabled || !path.exists()) {
+ return@let null
+ }
+
+ PerformanceInterferenceReader(path.inputStream()).use { reader -> reader.read() }
+ }
+
val targets = portfolio.get("targets", Document::class.java)
val topologyId = scenario.getEmbedded(listOf("topology", "topologyId"), ObjectId::class.java)
val environment = topologyParser.read(topologyId)
- val results = (0 until targets.getInteger("repeatsPerScenario")).map {
- logger.info { "Starting repeat $it" }
+ val results = (0 until targets.getInteger("repeatsPerScenario")).map { repeat ->
+ logger.info { "Starting repeat $repeat" }
withTimeout(runTimeout * 1000) {
- runRepeat(scenario, it, environment, traceReader)
+ val interferenceModel = interferenceGroups?.let { VmInterferenceModel(it, Random(repeat.toLong()).asJavaRandom()) }
+ runRepeat(scenario, repeat, environment, traceReader, interferenceModel)
}
}
@@ -191,6 +207,7 @@ public class RunnerCli : CliktCommand(name = "runner") {
repeat: Int,
environment: EnvironmentReader,
traceReader: RawParquetTraceReader,
+ interferenceModel: VmInterferenceModel?
): WebExperimentMonitor.Result {
val monitor = WebExperimentMonitor()
@@ -260,7 +277,7 @@ public class RunnerCli : CliktCommand(name = "runner") {
)
val failureFrequency = if (operational.getBoolean("failuresEnabled", false)) 24.0 * 7 else 0.0
- withComputeService(clock, meterProvider, environment, allocationPolicy) { scheduler ->
+ withComputeService(clock, meterProvider, environment, allocationPolicy, interferenceModel) { scheduler ->
val failureDomain = if (failureFrequency > 0) {
logger.debug { "ENABLING failures" }
createFailureDomain(
@@ -361,4 +378,4 @@ public class RunnerCli : CliktCommand(name = "runner") {
/**
* Main entry point of the runner.
*/
-public fun main(args: Array<String>): Unit = RunnerCli().main(args)
+fun main(args: Array<String>): Unit = RunnerCli().main(args)