summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2020-03-16 22:37:06 +0100
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-03-16 22:37:06 +0100
commitdf088c89b43c4bcb5051c42906e91258ccd69ce5 (patch)
tree907481fe3e2d2d7935ee7b4b6ffe14ed1ca012cb
parent7c2f254aacd17ee0e77a0b09a464baa8044b6c3a (diff)
parent1e95d668eb21eece59a402f500a9e38ec51af596 (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
-rw-r--r--opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/driver/hypervisor/HypervisorVirtDriver.kt6
-rw-r--r--opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/workload/PerformanceInterferenceModel.kt20
-rw-r--r--opendc/opendc-experiments-sc20/src/main/resources/env/performance-interference.json1
-rw-r--r--opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/PerformanceInterferenceEntry.kt1
-rw-r--r--opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20PerformanceInterferenceReader.kt4
-rw-r--r--opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt2
-rw-r--r--opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/vm/VmTraceReader.kt2
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(