diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-04-08 16:00:02 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-08 16:00:02 +0200 |
| commit | 3fd45fc5befb1fc9a67d4494e8a3786a5dceae3a (patch) | |
| tree | 739a8569545608068141288eb25ae80ce2597b7d /simulator/opendc-simulator | |
| parent | 5d3b759b18fb0a4278b43dea6a9db478b07804a5 (diff) | |
| parent | 638dd7a33d5f7f0b8fcca9c99cdc92819cf0847c (diff) | |
exp: Add experiment for OpenDC Energy project
This pull requests adds an experiment to the repository for the OpenDC Energy project.
This experiment currently runs the Solvinity traces and tests how different energy
models perform.
* Add new experiment `opendc-experiments-energy21`
* Link experiment to `ConsoleRunner` so that the experiment can be run from the
command line.
* `BatchRecorder` is now used to emit all metrics at once after the hypervisor
finishes a slice.
Diffstat (limited to 'simulator/opendc-simulator')
3 files changed, 24 insertions, 18 deletions
diff --git a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt index 1f26c9c9..252a40ec 100644 --- a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt +++ b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt @@ -101,11 +101,17 @@ public abstract class SimAbstractMachine(private val clock: Clock) : SimMachine for ((cpu, source) in resources) { val consumer = workload.getConsumer(ctx, cpu) val adapter = SimSpeedConsumerAdapter(consumer) { newSpeed -> + val _speed = _speed + val _usage = _usage + val oldSpeed = _speed[cpu.id] _speed[cpu.id] = newSpeed totalSpeed = totalSpeed - oldSpeed + newSpeed - updateUsage(totalSpeed / totalCapacity) + val newUsage = totalSpeed / totalCapacity + if (_usage.value != newUsage) { + updateUsage(totalSpeed / totalCapacity) + } } launch { source.consume(adapter) } diff --git a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt index 85613a57..cbfcd810 100644 --- a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt +++ b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt @@ -10,15 +10,12 @@ import kotlin.math.min * The linear interpolation power model partially adapted from CloudSim. * This model is developed to adopt the <a href="http://www.spec.org/power_ssj2008/">SPECpower benchmark</a>. * - * @param hardwareName The name of the hardware vendor. + * @param powerValues A [List] of average active power measured by the power analyzer(s) and accumulated by the + * PTDaemon (Power and Temperature Daemon) for this measurement interval, displayed as watts (W). * @see <a href="http://www.spec.org/power_ssj2008/results/res2011q1/">Machines used in the SPEC benchmark</a> */ -public class InterpolationPowerModel(hardwareName: String) : PowerModel { - /** - * A [List] of average active power measured by the power analyzer(s) and accumulated by the - * PTDaemon (Power and Temperature Daemon) for this measurement interval, displayed as watts (W). - */ - private val averagePowerValues: List<Double> = loadAveragePowerValue(hardwareName) +public class InterpolationPowerModel(private val powerValues: List<Double>) : PowerModel { + public constructor(hardwareName: String) : this(loadAveragePowerValue(hardwareName)) public override fun computePower(utilization: Double): Double { val clampedUtilization = min(1.0, max(0.0, utilization)) @@ -34,7 +31,7 @@ public class InterpolationPowerModel(hardwareName: String) : PowerModel { powerFlr + delta * (clampedUtilization - utilizationFlr.toDouble() / 10) * 100 } - override fun toString(): String = "InterpolationPowerModel[entries=${averagePowerValues.size}]" + override fun toString(): String = "InterpolationPowerModel[entries=${powerValues.size}]" /** * Gets the power consumption for a given utilization percentage. @@ -43,13 +40,15 @@ public class InterpolationPowerModel(hardwareName: String) : PowerModel { * where 10 means 100% of utilization. * @return the power consumption for the given utilization percentage */ - private fun getAveragePowerValue(index: Int): Double = averagePowerValues[index] + private fun getAveragePowerValue(index: Int): Double = powerValues[index] - private fun loadAveragePowerValue(hardwareName: String, path: String = "spec_machines.yml"): List<Double> { - val content = this::class - .java.classLoader - .getResourceAsStream(path) - val hardwareToAveragePowerValues: Map<String, List<Double>> = Yaml().load(content) - return hardwareToAveragePowerValues.getOrDefault(hardwareName, listOf()) + private companion object { + private fun loadAveragePowerValue(hardwareName: String, path: String = "spec_machines.yml"): List<Double> { + val content = this::class + .java.classLoader + .getResourceAsStream(path) + val hardwareToAveragePowerValues: Map<String, List<Double>> = Yaml().load(content) + return hardwareToAveragePowerValues.getOrDefault(hardwareName, listOf()) + } } } diff --git a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt index 2442d748..694a928b 100644 --- a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt +++ b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt @@ -50,14 +50,15 @@ public class SimTraceWorkload(public val trace: Sequence<Fragment>) : SimWorkloa override fun onNext(ctx: SimResourceContext): SimResourceCommand { val now = ctx.clock.millis() val fragment = fragment ?: return SimResourceCommand.Exit - val work = (fragment.duration / 1000) * fragment.usage + val usage = fragment.usage / fragment.cores + val work = (fragment.duration / 1000) * usage val deadline = offset + fragment.duration assert(deadline >= now) { "Deadline already passed" } val cmd = if (cpu.id < fragment.cores && work > 0.0) - SimResourceCommand.Consume(work, fragment.usage, deadline) + SimResourceCommand.Consume(work, usage, deadline) else SimResourceCommand.Idle(deadline) |
