summaryrefslogtreecommitdiff
path: root/opendc-simulator/opendc-simulator-compute
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-10-16 16:52:49 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-10-25 17:58:54 +0200
commitba310a3545c9631e1e4ff61a0a1759228ec5cf63 (patch)
treea8d818762f6459662a149465b6c9bc265f37c021 /opendc-simulator/opendc-simulator-compute
parent17951889c6d805b907d936d54e7e66efb7376879 (diff)
fix(simulator): Use correct flow input capacity for counters
This change fixes an issue with the FlowMultiplexer implementation where the capacity of each flow input was equal to the capacity of all flow outputs. Now, the user can specify the capacity of the input, which will be used to correctly compute the active and idle time.
Diffstat (limited to 'opendc-simulator/opendc-simulator-compute')
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimAbstractHypervisor.kt36
1 files changed, 20 insertions, 16 deletions
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimAbstractHypervisor.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimAbstractHypervisor.kt
index 90bf5e25..eda59d2d 100644
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimAbstractHypervisor.kt
+++ b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimAbstractHypervisor.kt
@@ -144,7 +144,7 @@ public abstract class SimAbstractHypervisor(
*/
private inner class VirtualMachine(
model: MachineModel,
- private val interferenceId: String? = null
+ interferenceId: String? = null
) : SimAbstractMachine(engine, parent = null, model), SimVirtualMachine {
/**
* The interference key of this virtual machine.
@@ -154,24 +154,14 @@ public abstract class SimAbstractHypervisor(
/**
* The vCPUs of the machine.
*/
- override val cpus = model.cpus.map { VCpu(mux, mux.newInput(interferenceKey), it) }
+ override val cpus = model.cpus.map { cpu -> VCpu(mux, mux.newInput(cpu.frequency, interferenceKey), cpu) }
/**
* The resource counters associated with the hypervisor.
*/
override val counters: SimHypervisorCounters
get() = _counters
- private val _counters = object : SimHypervisorCounters {
- private val d = cpus.size / cpus.sumOf { it.model.frequency } * 1000
-
- override val cpuActiveTime: Long
- get() = (cpus.sumOf { it.counters.actual } * d).roundToLong()
- override val cpuIdleTime: Long
- get() = (cpus.sumOf { it.counters.actual + it.counters.remaining } * d).roundToLong()
- override val cpuStealTime: Long
- get() = (cpus.sumOf { it.counters.demand - it.counters.actual } * d).roundToLong()
- override val cpuLostTime: Long = (cpus.sumOf { it.counters.interference } * d).roundToLong()
- }
+ private val _counters = VmCountersImpl(cpus)
/**
* The CPU capacity of the hypervisor in MHz.
@@ -235,9 +225,7 @@ public abstract class SimAbstractHypervisor(
) : SimProcessingUnit, FlowConsumer by source {
override var capacity: Double
get() = source.capacity
- set(_) {
- // Ignore capacity changes
- }
+ set(_) = TODO("Capacity changes on vCPU not supported")
override fun toString(): String = "SimAbstractHypervisor.VCpu[model=$model]"
@@ -311,4 +299,20 @@ public abstract class SimAbstractHypervisor(
cpuTime[3] += (interferenceDelta * d).roundToLong()
}
}
+
+ /**
+ * A [SimHypervisorCounters] implementation for a virtual machine.
+ */
+ private class VmCountersImpl(private val cpus: List<VCpu>) : SimHypervisorCounters {
+ private val d = cpus.size / cpus.sumOf { it.model.frequency } * 1000
+
+ override val cpuActiveTime: Long
+ get() = (cpus.sumOf { it.counters.actual } * d).roundToLong()
+ override val cpuIdleTime: Long
+ get() = (cpus.sumOf { it.counters.actual + it.counters.remaining } * d).roundToLong()
+ override val cpuStealTime: Long
+ get() = (cpus.sumOf { it.counters.demand - it.counters.actual } * d).roundToLong()
+ override val cpuLostTime: Long
+ get() = (cpus.sumOf { it.counters.interference } * d).roundToLong()
+ }
}