diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2020-03-16 22:37:06 +0100 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2020-03-16 22:37:06 +0100 |
| commit | df088c89b43c4bcb5051c42906e91258ccd69ce5 (patch) | |
| tree | 907481fe3e2d2d7935ee7b4b6ffe14ed1ca012cb | |
| parent | 7c2f254aacd17ee0e77a0b09a464baa8044b6c3a (diff) | |
| parent | 1e95d668eb21eece59a402f500a9e38ec51af596 (diff) | |
Merge branch '2.x-perf-interf-extension' into '2.x'
Extend performance interference model to support minimum server load
See merge request opendc/opendc-simulator!43
7 files changed, 22 insertions, 14 deletions
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 7cd48bc3..430e5a37 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 @@ -145,6 +145,7 @@ class HypervisorVirtDriver( val burst = LongArray(hostContext.cpus.size) val totalUsage = maxUsage - availableUsage availableUsage = totalUsage + val serverLoad = totalUsage / maxUsage // Divide the requests over the available capacity of the pCPUs fairly for (i in hostContext.cpus.indices.sortedBy { hostContext.cpus[it].frequency }) { @@ -174,8 +175,9 @@ class HypervisorVirtDriver( for (vm in vms) { // Apply performance interference model - val performanceModel = vm.server.image.tags[IMAGE_PERF_INTERFERENCE_MODEL] as? PerformanceInterferenceModel? - val performanceScore = performanceModel?.apply(imagesRunning) ?: 1.0 + val performanceModel = + vm.server.image.tags[IMAGE_PERF_INTERFERENCE_MODEL] as? PerformanceInterferenceModel? + val performanceScore = performanceModel?.apply(imagesRunning, serverLoad) ?: 1.0 for ((i, req) in vm.requests.withIndex()) { // Compute the fraction of compute time allocated to the VM diff --git a/opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/workload/PerformanceInterferenceModel.kt b/opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/workload/PerformanceInterferenceModel.kt index bc9b0b06..78d5cd82 100644 --- a/opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/workload/PerformanceInterferenceModel.kt +++ b/opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/workload/PerformanceInterferenceModel.kt @@ -1,7 +1,6 @@ package com.atlarge.opendc.core.workload import com.atlarge.opendc.core.resource.Resource -import java.util.UUID /** * Meta-data key for the [PerformanceInterferenceModel] of an image. @@ -16,28 +15,33 @@ const val IMAGE_PERF_INTERFERENCE_MODEL = "image:performance-interference" data class PerformanceInterferenceModel( val items: Set<PerformanceInterferenceModelItem> ) { - fun apply(colocatedWorkloads: Set<Resource>): Double { + fun apply(colocatedWorkloads: Set<Resource>, currentServerLoad: Double): Double { val colocatedWorkloadIds = colocatedWorkloads.map { it.name } val intersectingItems = items.filter { item -> - colocatedWorkloadIds.intersect(item.workloadIds).size > 1 + colocatedWorkloadIds.intersect(item.workloadNames).size > 1 } if (intersectingItems.isEmpty()) { return 1.0 } - return intersectingItems.map { it.performanceScore }.min() ?: error("Minimum score must exist.") + return intersectingItems + .filter { it.minServerLoad <= currentServerLoad } + .map { it.performanceScore } + .min() ?: 1.0 } } /** * Model describing how a specific set of workloads causes performance variability for each workload. * - * @param workloadIds The IDs of the workloads that together cause performance variability for each workload in the set. + * @param workloadNames The names of the workloads that together cause performance variability for each workload in the set. + * @param minServerLoad The minimum total server load at which this interference is activated and noticeable. * @param performanceScore The performance score that should be applied to each workload's performance. 1 means no * influence, <1 means that performance degrades, and >1 means that performance improves. */ data class PerformanceInterferenceModelItem( - val workloadIds: Set<UUID>, + val workloadNames: Set<String>, + val minServerLoad: Double, val performanceScore: Double ) { override fun equals(other: Any?): Boolean { @@ -46,12 +50,12 @@ data class PerformanceInterferenceModelItem( other as PerformanceInterferenceModelItem - if (workloadIds != other.workloadIds) return false + if (workloadNames != other.workloadNames) return false return true } override fun hashCode(): Int { - return workloadIds.hashCode() + return workloadNames.hashCode() } } diff --git a/opendc/opendc-experiments-sc20/src/main/resources/env/performance-interference.json b/opendc/opendc-experiments-sc20/src/main/resources/env/performance-interference.json index e2437693..87a4f8af 100644 --- a/opendc/opendc-experiments-sc20/src/main/resources/env/performance-interference.json +++ b/opendc/opendc-experiments-sc20/src/main/resources/env/performance-interference.json @@ -1,6 +1,7 @@ [ { "vms": [545, 223], + "minServerLoad": 0.84, "performanceScore": 0.6 } ] diff --git a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/PerformanceInterferenceEntry.kt b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/PerformanceInterferenceEntry.kt index 1eeecb25..ade47e1b 100644 --- a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/PerformanceInterferenceEntry.kt +++ b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/PerformanceInterferenceEntry.kt @@ -2,5 +2,6 @@ package com.atlarge.opendc.format.trace.sc20 internal data class PerformanceInterferenceEntry( val vms: List<String>, + val minServerLoad: Double, val performanceScore: Double ) diff --git a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20PerformanceInterferenceReader.kt b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20PerformanceInterferenceReader.kt index b2d60bb9..daa1fdf8 100644 --- a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20PerformanceInterferenceReader.kt +++ b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20PerformanceInterferenceReader.kt @@ -31,7 +31,6 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue import java.io.InputStream -import java.util.UUID /** * A parser for the JSON performance interference setup files used for the SC20 paper. @@ -50,7 +49,8 @@ class Sc20PerformanceInterferenceReader(input: InputStream, mapper: ObjectMapper return PerformanceInterferenceModel( performanceInterferenceModel.map { item -> PerformanceInterferenceModelItem( - item.vms.map { name -> UUID(0L, name.toLong()) }.toSet(), + item.vms.toSet(), + item.minServerLoad, item.performanceScore ) }.toSet() diff --git a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt index 3c974e44..78a58671 100644 --- a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt +++ b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt @@ -125,7 +125,7 @@ class Sc20TraceReader( val uuid = UUID.randomUUID() val relevantPerformanceInterferenceModelItems = PerformanceInterferenceModel( - performanceInterferenceModel.items.filter { it.workloadIds.contains(uuid) }.toSet() + performanceInterferenceModel.items.filter { it.workloadNames.contains(vmId) }.toSet() ) val vmWorkload = VmWorkload( diff --git a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/vm/VmTraceReader.kt b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/vm/VmTraceReader.kt index d001687c..6b8843aa 100644 --- a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/vm/VmTraceReader.kt +++ b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/vm/VmTraceReader.kt @@ -123,7 +123,7 @@ class VmTraceReader( val uuid = UUID(0L, vmId) val relevantPerformanceInterferenceModelItems = PerformanceInterferenceModel( - performanceInterferenceModel.items.filter { it.workloadIds.contains(uuid) }.toSet() + performanceInterferenceModel.items.filter { it.workloadNames.contains(vmId.toString()) }.toSet() ) val vmWorkload = VmWorkload( |
