From 40ac395ee59dbb4ae16b7b77581cd14245c71f39 Mon Sep 17 00:00:00 2001 From: Georgios Andreadis Date: Fri, 28 Feb 2020 15:14:02 +0100 Subject: Give vCPUs access to their hosted VM This should make performance interference based onn the colocated VMs possible. --- .../virt/driver/hypervisor/VmServerContext.kt | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt (limited to 'opendc/opendc-compute/src/main') diff --git a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt new file mode 100644 index 00000000..f8fb2033 --- /dev/null +++ b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt @@ -0,0 +1,61 @@ +package com.atlarge.opendc.compute.virt.driver.hypervisor + +import com.atlarge.odcsim.SimulationContext +import com.atlarge.opendc.compute.core.Server +import com.atlarge.opendc.compute.core.ServerState +import com.atlarge.opendc.compute.core.execution.ProcessorContext +import com.atlarge.opendc.compute.core.execution.ServerManagementContext +import com.atlarge.opendc.compute.core.monitor.ServerMonitor +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch + +/** + * The execution context of an image running as a server. + * + * @property server The server instance of this execution context. + * @property monitor The monitor that should be informed on changes. + * @property scheduler The local VM scheduler. + * @property onExit The callback to be invoked on exit of the server. + * @param ctx The simulation context in which this server is running. + */ +class VmServerContext( + override var server: Server, + val monitor: ServerMonitor, + val scheduler: VmScheduler, + val onExit: () -> Unit, + ctx: SimulationContext +) : ServerManagementContext { + private var initialized: Boolean = false + + internal val job: Job = ctx.domain.launch { + init() + try { + server.image(this@VmServerContext) + exit() + } catch (cause: Throwable) { + exit(cause) + } + } + + override val cpus: List = scheduler.createVirtualCpus(server.flavor, this) + + override suspend fun init() { + if (initialized) { + throw IllegalStateException() + } + + val previousState = server.state + server = server.copy(state = ServerState.ACTIVE) + monitor.onUpdate(server, previousState) + initialized = true + } + + override suspend fun exit(cause: Throwable?) { + val previousState = server.state + val state = if (cause == null) ServerState.SHUTOFF else ServerState.ERROR + server = server.copy(state = state) + onExit() + monitor.onUpdate(server, previousState) + initialized = false + } +} -- cgit v1.2.3 From 185c0ab39225e1c6d45122626f90e79c2f2f3cc4 Mon Sep 17 00:00:00 2001 From: Georgios Andreadis Date: Fri, 28 Feb 2020 15:23:45 +0100 Subject: Make onExit suspending --- .../atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'opendc/opendc-compute/src/main') diff --git a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt index f8fb2033..60fdf082 100644 --- a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt +++ b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt @@ -22,7 +22,7 @@ class VmServerContext( override var server: Server, val monitor: ServerMonitor, val scheduler: VmScheduler, - val onExit: () -> Unit, + val onExit: suspend () -> Unit, ctx: SimulationContext ) : ServerManagementContext { private var initialized: Boolean = false -- cgit v1.2.3 From 4e970798cce73906de212ca26ba64cb470478a9b Mon Sep 17 00:00:00 2001 From: Georgios Andreadis Date: Wed, 4 Mar 2020 18:21:23 +0100 Subject: Fix rebase --- .../virt/driver/hypervisor/HypervisorVirtDriver.kt | 15 +++++- .../virt/driver/hypervisor/VmServerContext.kt | 61 ---------------------- 2 files changed, 13 insertions(+), 63 deletions(-) delete mode 100644 opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt (limited to 'opendc/opendc-compute/src/main') diff --git a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt index 3f358516..006b31e1 100644 --- a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt +++ b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt @@ -26,9 +26,9 @@ package com.atlarge.opendc.compute.virt.driver.hypervisor import com.atlarge.odcsim.SimulationContext import com.atlarge.odcsim.simulationContext -import com.atlarge.opendc.compute.core.Server import com.atlarge.opendc.compute.core.Flavor import com.atlarge.opendc.compute.core.ProcessingUnit +import com.atlarge.opendc.compute.core.Server import com.atlarge.opendc.compute.core.ServerState import com.atlarge.opendc.compute.core.execution.ServerContext import com.atlarge.opendc.compute.core.execution.ServerManagementContext @@ -37,6 +37,7 @@ import com.atlarge.opendc.compute.core.monitor.ServerMonitor import com.atlarge.opendc.compute.virt.driver.VirtDriver import com.atlarge.opendc.compute.virt.driver.VirtDriverMonitor import com.atlarge.opendc.compute.virt.monitor.HypervisorMonitor +import com.atlarge.opendc.core.workload.PerformanceInterferenceModel import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job import kotlinx.coroutines.channels.Channel @@ -135,7 +136,17 @@ class HypervisorVirtDriver( val burst = LongArray(hostContext.cpus.size) + val imagesRunning = vms.map { it.server.image }.toSet() + for (vm in vms) { + var performanceScore = 1.0 + + // Apply performance interference model + if (vm.server.image.tags.containsKey("performance-interference")) { + performanceScore = (vm.server.image.tags["performance-interference"] + as PerformanceInterferenceModel).apply(imagesRunning) + } + for (i in 0 until min(vm.cpus.size, vm.requestedBurst.size)) { val cpu = vm.cpus[i] @@ -143,7 +154,7 @@ class HypervisorVirtDriver( val actualUsage = min(vm.limit[i], cpu.frequency / vms.size) val actualBurst = (duration * actualUsage * 1_000_000L).toLong() - burst[i] += actualBurst + burst[i] += (performanceScore * actualBurst).toLong() } } diff --git a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt deleted file mode 100644 index 60fdf082..00000000 --- a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/VmServerContext.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.atlarge.opendc.compute.virt.driver.hypervisor - -import com.atlarge.odcsim.SimulationContext -import com.atlarge.opendc.compute.core.Server -import com.atlarge.opendc.compute.core.ServerState -import com.atlarge.opendc.compute.core.execution.ProcessorContext -import com.atlarge.opendc.compute.core.execution.ServerManagementContext -import com.atlarge.opendc.compute.core.monitor.ServerMonitor -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch - -/** - * The execution context of an image running as a server. - * - * @property server The server instance of this execution context. - * @property monitor The monitor that should be informed on changes. - * @property scheduler The local VM scheduler. - * @property onExit The callback to be invoked on exit of the server. - * @param ctx The simulation context in which this server is running. - */ -class VmServerContext( - override var server: Server, - val monitor: ServerMonitor, - val scheduler: VmScheduler, - val onExit: suspend () -> Unit, - ctx: SimulationContext -) : ServerManagementContext { - private var initialized: Boolean = false - - internal val job: Job = ctx.domain.launch { - init() - try { - server.image(this@VmServerContext) - exit() - } catch (cause: Throwable) { - exit(cause) - } - } - - override val cpus: List = scheduler.createVirtualCpus(server.flavor, this) - - override suspend fun init() { - if (initialized) { - throw IllegalStateException() - } - - val previousState = server.state - server = server.copy(state = ServerState.ACTIVE) - monitor.onUpdate(server, previousState) - initialized = true - } - - override suspend fun exit(cause: Throwable?) { - val previousState = server.state - val state = if (cause == null) ServerState.SHUTOFF else ServerState.ERROR - server = server.copy(state = state) - onExit() - monitor.onUpdate(server, previousState) - initialized = false - } -} -- cgit v1.2.3 From 0930e73c319ecd01ecdae47e15f077555c12db0c Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Mon, 9 Mar 2020 20:46:28 +0100 Subject: feat: Define key for performance interference model of image --- .../compute/virt/driver/hypervisor/HypervisorVirtDriver.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'opendc/opendc-compute/src/main') diff --git a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt index 006b31e1..6fe11c28 100644 --- a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt +++ b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt @@ -37,6 +37,7 @@ import com.atlarge.opendc.compute.core.monitor.ServerMonitor import com.atlarge.opendc.compute.virt.driver.VirtDriver import com.atlarge.opendc.compute.virt.driver.VirtDriverMonitor import com.atlarge.opendc.compute.virt.monitor.HypervisorMonitor +import com.atlarge.opendc.core.workload.IMAGE_PERF_INTERFERENCE_MODEL import com.atlarge.opendc.core.workload.PerformanceInterferenceModel import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job @@ -139,13 +140,9 @@ class HypervisorVirtDriver( val imagesRunning = vms.map { it.server.image }.toSet() for (vm in vms) { - var performanceScore = 1.0 - // Apply performance interference model - if (vm.server.image.tags.containsKey("performance-interference")) { - performanceScore = (vm.server.image.tags["performance-interference"] - as PerformanceInterferenceModel).apply(imagesRunning) - } + val performanceModel = vm.server.image.tags[IMAGE_PERF_INTERFERENCE_MODEL] as? PerformanceInterferenceModel? + val performanceScore = performanceModel?.apply(imagesRunning) ?: 1.0 for (i in 0 until min(vm.cpus.size, vm.requestedBurst.size)) { val cpu = vm.cpus[i] -- cgit v1.2.3