From bbf77c59f5b2532ebca8daf8e67012205d764b97 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Fri, 24 Jul 2020 13:31:22 +0200 Subject: Fix performance interference in HPC experiments --- .../compute/core/workload/PerformanceInterferenceModel.kt | 11 +++++------ .../atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/simulator/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/core/workload/PerformanceInterferenceModel.kt b/simulator/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/core/workload/PerformanceInterferenceModel.kt index f458877b..e1f03d21 100644 --- a/simulator/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/core/workload/PerformanceInterferenceModel.kt +++ b/simulator/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/core/workload/PerformanceInterferenceModel.kt @@ -25,8 +25,7 @@ package com.atlarge.opendc.compute.core.workload import com.atlarge.opendc.compute.core.Server -import java.util.SortedSet -import java.util.TreeSet +import java.util.* import kotlin.random.Random /** @@ -44,21 +43,21 @@ class PerformanceInterferenceModel( val random: Random = Random(0) ) { private var intersectingItems: List = emptyList() - private val colocatedWorkloads = TreeSet() + private val colocatedWorkloads = TreeMap() fun vmStarted(server: Server) { - colocatedWorkloads.add(server.image.name) + colocatedWorkloads.merge(server.image.name, 1, Int::plus) intersectingItems = items.filter { item -> doesMatch(item) } } fun vmStopped(server: Server) { - colocatedWorkloads.remove(server.image.name) + colocatedWorkloads.computeIfPresent(server.image.name) { _, v -> (v - 1).takeUnless { it == 0 } } intersectingItems = items.filter { item -> doesMatch(item) } } private fun doesMatch(item: PerformanceInterferenceModelItem): Boolean { var count = 0 - for (name in item.workloadNames.subSet(colocatedWorkloads.first(), colocatedWorkloads.last() + "\u0000")) { + for (name in item.workloadNames.subSet(colocatedWorkloads.firstKey(), colocatedWorkloads.lastKey() + "\u0000")) { if (name in colocatedWorkloads) count++ if (count > 1) diff --git a/simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt b/simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt index 99830717..a46bb3e6 100644 --- a/simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt +++ b/simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt @@ -201,13 +201,13 @@ private fun sample(entry: TraceEntry, i: Int): TraceEntry