diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2020-07-09 16:23:40 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2020-08-24 19:48:15 +0200 |
| commit | 765056e31b6880360f904a44962b7ce0e700bf43 (patch) | |
| tree | b86312d2572253825d5d82ffc894e1b3dabec75e | |
| parent | 04686bf5cef4aea51fd613a158aa8b155763d0e7 (diff) | |
Add initial HPC sampler implementation
| -rw-r--r-- | simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt | 69 |
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 +} |
