summaryrefslogtreecommitdiff
path: root/simulator/opendc/opendc-experiments-sc20/src
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2020-07-09 16:23:40 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-08-24 19:48:15 +0200
commit765056e31b6880360f904a44962b7ce0e700bf43 (patch)
treeb86312d2572253825d5d82ffc894e1b3dabec75e /simulator/opendc/opendc-experiments-sc20/src
parent04686bf5cef4aea51fd613a158aa8b155763d0e7 (diff)
Add initial HPC sampler implementation
Diffstat (limited to 'simulator/opendc/opendc-experiments-sc20/src')
-rw-r--r--simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt69
1 files changed, 69 insertions, 0 deletions
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 f2a0e627..bb4f60c7 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
@@ -83,3 +83,72 @@ fun sampleRegularWorkload(
return res
}
+
+/**
+ * Sample a HPC workload.
+ */
+fun sampleHPCWorkload(
+ trace: List<TraceEntry<VmWorkload>>,
+ workload: Workload,
+ seed: Int,
+ fraction: Double,
+ sampleOnLoad: Boolean
+): List<TraceEntry<VmWorkload>> {
+ val pattern = Regex("^(ComputeNode|cn)")
+ val random = Random(seed)
+
+ val (hpc, nonHpc) = trace.partition { entry ->
+ val name = entry.workload.image.name
+ name.matches(pattern)
+ }
+
+ val totalLoad = if (workload is CompositeWorkload) {
+ workload.totalLoad
+ } else {
+ trace.sumByDouble { it.workload.image.tags.getValue("total-load") as Double }
+ }
+
+ val res = mutableListOf<TraceEntry<VmWorkload>>()
+
+ if (sampleOnLoad) {
+ val hpcPool = mutableListOf<TraceEntry<VmWorkload>>()
+
+ // We repeat the HPC VMs 1000 times to have a large enough pool to pick VMs from.
+ repeat(1000) {
+ hpcPool.addAll(hpc)
+ }
+ hpcPool.shuffle(random)
+
+ var currentLoad = 0.0
+ for (entry in hpcPool) {
+ val entryLoad = entry.workload.image.tags.getValue("total-load") as Double
+ if ((currentLoad + entryLoad) / totalLoad > fraction || res.size > trace.size) {
+ break
+ }
+
+ currentLoad += entryLoad
+ res += entry
+ }
+
+ (nonHpc as MutableList<TraceEntry<VmWorkload>>).shuffle(random)
+ for (entry in nonHpc) {
+ val entryLoad = entry.workload.image.tags.getValue("total-load") as Double
+ if ((currentLoad + entryLoad) / totalLoad > 1 || res.size > trace.size) {
+ break
+ }
+
+ currentLoad += entryLoad
+ res += entry
+ }
+ } else {
+ (hpc as MutableList<TraceEntry<VmWorkload>>).shuffle(random)
+ (nonHpc as MutableList<TraceEntry<VmWorkload>>).shuffle(random)
+
+ res.addAll(hpc.subList(0, (fraction * trace.size).toInt()))
+ res.addAll(nonHpc.subList(0, ((1 - fraction) * trace.size).toInt()))
+ }
+
+ logger.info { "Sampled ${trace.size} VMs (fraction $fraction) into subset of ${res.size} VMs" }
+
+ return res
+}