summaryrefslogtreecommitdiff
path: root/opendc-compute
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-compute')
-rw-r--r--opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/driver/HostModel.java4
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/VCpuCapacityFilter.kt2
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/CoreRamWeigher.kt2
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuCapacityWeigher.kt2
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuWeigher.kt2
-rw-r--r--opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt14
-rw-r--r--opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt44
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt21
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/DefaultWorkloadMapper.kt4
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt5
-rw-r--r--opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt71
-rw-r--r--opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt13
-rw-r--r--opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/DfltHostExportColumns.kt4
-rw-r--r--opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostInfo.kt9
-rw-r--r--opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt15
15 files changed, 112 insertions, 100 deletions
diff --git a/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/driver/HostModel.java b/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/driver/HostModel.java
index 2d45817b..87464fe1 100644
--- a/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/driver/HostModel.java
+++ b/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/driver/HostModel.java
@@ -26,7 +26,7 @@ package org.opendc.compute.service.driver;
* Record describing the static machine properties of the host.
*
* @param cpuCapacity The total CPU capacity of the host in MHz.
- * @param cpuCount The number of logical processing cores available for this host.
+ * @param coreCount The number of logical processing cores available for this host.
* @param memoryCapacity The amount of memory available for this host in MB.
*/
-public record HostModel(double cpuCapacity, int cpuCount, int coreCount, long memoryCapacity) {}
+public record HostModel(double cpuCapacity, int coreCount, long memoryCapacity) {}
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/VCpuCapacityFilter.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/VCpuCapacityFilter.kt
index f87658cd..5af7ccf0 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/VCpuCapacityFilter.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/VCpuCapacityFilter.kt
@@ -36,7 +36,7 @@ public class VCpuCapacityFilter : HostFilter {
): Boolean {
val requiredCapacity = task.flavor.meta["cpu-capacity"] as? Double
val hostModel = host.host.model
- val availableCapacity = hostModel.cpuCapacity / hostModel.cpuCount
+ val availableCapacity = hostModel.cpuCapacity
return requiredCapacity == null || availableCapacity >= (requiredCapacity / task.flavor.coreCount)
}
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/CoreRamWeigher.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/CoreRamWeigher.kt
index d84f5e68..6e320bf4 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/CoreRamWeigher.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/CoreRamWeigher.kt
@@ -37,7 +37,7 @@ public class CoreRamWeigher(override val multiplier: Double = 1.0) : HostWeigher
host: HostView,
task: Task,
): Double {
- return host.availableMemory.toDouble() / host.host.model.cpuCount
+ return host.availableMemory.toDouble()
}
override fun toString(): String = "CoreRamWeigher"
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuCapacityWeigher.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuCapacityWeigher.kt
index 6d1482ff..5f99cab3 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuCapacityWeigher.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuCapacityWeigher.kt
@@ -35,7 +35,7 @@ public class VCpuCapacityWeigher(override val multiplier: Double = 1.0) : HostWe
): Double {
val model = host.host.model
val requiredCapacity = task.flavor.meta["cpu-capacity"] as? Double ?: 0.0
- return model.cpuCapacity / model.cpuCount - requiredCapacity / task.flavor.coreCount
+ return model.cpuCapacity - requiredCapacity / task.flavor.coreCount
}
override fun toString(): String = "VCpuWeigher"
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuWeigher.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuWeigher.kt
index dfc30b54..0c3d9c21 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuWeigher.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/weights/VCpuWeigher.kt
@@ -39,7 +39,7 @@ public class VCpuWeigher(private val allocationRatio: Double, override val multi
host: HostView,
task: Task,
): Double {
- return host.host.model.cpuCount * allocationRatio - host.provisionedCores
+ return allocationRatio - host.provisionedCores
}
override fun toString(): String = "VCpuWeigher"
diff --git a/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt b/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt
index fa5b775e..eb686faf 100644
--- a/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt
+++ b/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/ComputeServiceTest.kt
@@ -136,7 +136,7 @@ internal class ComputeServiceTest {
scope.runSimulation {
val host = mockk<Host>(relaxUnitFun = true)
- every { host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.state } returns HostState.UP
assertEquals(emptySet<Host>(), service.hosts)
@@ -157,7 +157,7 @@ internal class ComputeServiceTest {
scope.runSimulation {
val host = mockk<Host>(relaxUnitFun = true)
- every { host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.state } returns HostState.DOWN
assertEquals(emptySet<Host>(), service.hosts)
@@ -230,7 +230,7 @@ internal class ComputeServiceTest {
scope.runSimulation {
val host = mockk<Host>(relaxUnitFun = true)
- every { host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.state } returns HostState.UP
every { host.canFit(any()) } returns false
@@ -256,7 +256,7 @@ internal class ComputeServiceTest {
val listeners = mutableListOf<HostListener>()
every { host.uid } returns UUID.randomUUID()
- every { host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.state } returns HostState.DOWN
every { host.addListener(any()) } answers { listeners.add(it.invocation.args[0] as HostListener) }
every { host.canFit(any()) } returns false
@@ -288,7 +288,7 @@ internal class ComputeServiceTest {
val listeners = mutableListOf<HostListener>()
every { host.uid } returns UUID.randomUUID()
- every { host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.state } returns HostState.UP
every { host.addListener(any()) } answers { listeners.add(it.invocation.args[0] as HostListener) }
every { host.canFit(any()) } returns false
@@ -320,7 +320,7 @@ internal class ComputeServiceTest {
val listeners = mutableListOf<HostListener>()
every { host.uid } returns UUID.randomUUID()
- every { host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.state } returns HostState.UP
every { host.canFit(any()) } returns true
every { host.addListener(any()) } answers { listeners.add(it.invocation.args[0] as HostListener) }
@@ -364,7 +364,7 @@ internal class ComputeServiceTest {
val listeners = mutableListOf<HostListener>()
every { host.uid } returns UUID.randomUUID()
- every { host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.state } returns HostState.UP
every { host.canFit(any()) } returns true
every { host.addListener(any()) } answers { listeners.add(it.invocation.args[0] as HostListener) }
diff --git a/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt b/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt
index 2478bf82..add10f8f 100644
--- a/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt
+++ b/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt
@@ -193,12 +193,12 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostA.availableMemory } returns 512
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.availableMemory } returns 2048
scheduler.addHost(hostA)
@@ -221,7 +221,7 @@ internal class FilterSchedulerTest {
val host = mockk<HostView>()
every { host.host.state } returns HostState.UP
- every { host.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.availableMemory } returns 2048
scheduler.addHost(host)
@@ -243,12 +243,12 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostA.provisionedCores } returns 3
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.provisionedCores } returns 0
scheduler.addHost(hostA)
@@ -271,7 +271,7 @@ internal class FilterSchedulerTest {
val host = mockk<HostView>()
every { host.host.state } returns HostState.UP
- every { host.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { host.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { host.provisionedCores } returns 0
scheduler.addHost(host)
@@ -294,13 +294,13 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(8 * 2600.0, 1, 8, 2048)
+ every { hostA.host.model } returns HostModel(8 * 2600.0, 8, 2048)
every { hostA.availableMemory } returns 512
scheduler.addHost(hostA)
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 3200.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 3200.0, 4, 2048)
every { hostB.availableMemory } returns 512
scheduler.addHost(hostB)
@@ -323,12 +323,12 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostA.instanceCount } returns 2
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.instanceCount } returns 0
scheduler.addHost(hostA)
@@ -356,13 +356,13 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostA.host.instances } returns emptySet()
every { hostA.provisionedCores } returns 3
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.host.instances } returns setOf(taskA)
every { hostB.provisionedCores } returns 0
@@ -396,13 +396,13 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostA.host.instances } returns setOf(taskA)
every { hostA.provisionedCores } returns 3
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.host.instances } returns emptySet()
every { hostB.provisionedCores } returns 0
@@ -431,12 +431,12 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostA.availableMemory } returns 1024
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.availableMemory } returns 512
scheduler.addHost(hostA)
@@ -460,12 +460,12 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(12 * 2600.0, 1, 12, 2048)
+ every { hostA.host.model } returns HostModel(12 * 2600.0, 12, 2048)
every { hostA.availableMemory } returns 1024
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.availableMemory } returns 512
scheduler.addHost(hostA)
@@ -488,12 +488,12 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostA.provisionedCores } returns 2
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.provisionedCores } returns 0
scheduler.addHost(hostA)
@@ -516,12 +516,12 @@ internal class FilterSchedulerTest {
val hostA = mockk<HostView>()
every { hostA.host.state } returns HostState.UP
- every { hostA.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostA.instanceCount } returns 2
val hostB = mockk<HostView>()
every { hostB.host.state } returns HostState.UP
- every { hostB.host.model } returns HostModel(4 * 2600.0, 1, 4, 2048)
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
every { hostB.instanceCount } returns 0
scheduler.addHost(hostA)
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
index ac0a8043..e681403c 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
@@ -41,8 +41,6 @@ import org.opendc.simulator.compute.SimMachineContext
import org.opendc.simulator.compute.kernel.SimHypervisor
import org.opendc.simulator.compute.model.MachineModel
import org.opendc.simulator.compute.model.MemoryUnit
-import org.opendc.simulator.compute.model.ProcessingNode
-import org.opendc.simulator.compute.model.ProcessingUnit
import org.opendc.simulator.compute.workload.SimWorkload
import org.opendc.simulator.compute.workload.SimWorkloads
import java.time.Duration
@@ -96,10 +94,9 @@ public class SimHost(
private val model: HostModel =
HostModel(
- machine.model.cpus.sumOf { it.frequency },
- machine.model.cpus.size,
- machine.model.cpus.sumOf { it.node.coreCount },
- machine.model.memory.sumOf { it.size },
+ machine.model.cpu.totalCapacity,
+ machine.model.cpu.coreCount,
+ machine.model.memory.size,
)
/**
@@ -349,22 +346,14 @@ public class SimHost(
* Convert flavor to machine model.
*/
private fun Flavor.toMachineModel(): MachineModel {
- val originalCpu = machine.model.cpus[0]
- val originalNode = originalCpu.node
- val cpuCapacity = (this.meta["cpu-capacity"] as? Double ?: Double.MAX_VALUE).coerceAtMost(originalCpu.frequency)
- val processingNode = ProcessingNode(originalNode.vendor, originalNode.modelName, originalNode.architecture, coreCount)
- val processingUnits = (0 until coreCount).map { ProcessingUnit(processingNode, it, cpuCapacity) }
- val memoryUnits = listOf(MemoryUnit("Generic", "Generic", 3200.0, memorySize))
-
- val model = MachineModel(processingUnits, memoryUnits)
- return if (optimize) model.optimize() else model
+ return MachineModel(machine.model.cpu, MemoryUnit("Generic", "Generic", 3200.0, memorySize))
}
private var localLastReport = clock.millis()
private var localUptime = 0L
private var localDowntime = 0L
private var localBootTime: Instant? = null
- private val localCpuLimit = machine.model.cpus.sumOf { it.frequency * it.node.coreCount }
+ private val localCpuLimit = machine.model.cpu.totalCapacity
/**
* Helper function to track the uptime of a machine.
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/DefaultWorkloadMapper.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/DefaultWorkloadMapper.kt
index ea8f51d0..412da37f 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/DefaultWorkloadMapper.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/DefaultWorkloadMapper.kt
@@ -39,8 +39,8 @@ internal object DefaultWorkloadMapper : SimWorkloadMapper {
override fun createWorkload(task: Task): SimWorkload {
val workload = delegate.createWorkload(task)
- // FIXME: look at connecting this to frontend. Probably not needed since the duration is so small
- val bootWorkload = SimWorkloads.runtime(Duration.ofMillis(1), 0.8, 0L, 0L)
+ // FIXME: look at connecting this to frontend. This does currently not work correctly
+ val bootWorkload = SimWorkloads.runtime(Duration.ofMillis(0), 1.0, 0L, 0L)
return SimWorkloads.chain(bootWorkload, workload)
}
}
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
index 1925233f..cf6c146a 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
@@ -31,7 +31,6 @@ import org.opendc.compute.simulator.SimHost
import org.opendc.compute.simulator.SimWorkloadMapper
import org.opendc.simulator.compute.SimMachineContext
import org.opendc.simulator.compute.kernel.SimHypervisor
-import org.opendc.simulator.compute.kernel.SimVirtualMachine
import org.opendc.simulator.compute.workload.SimWorkload
import java.time.Duration
import java.time.Instant
@@ -47,7 +46,7 @@ internal class Guest(
private val mapper: SimWorkloadMapper,
private val listener: GuestListener,
val task: Task,
- val machine: SimVirtualMachine,
+ val machine: SimHypervisor.SimVirtualMachine,
) {
/**
* The state of the [Guest].
@@ -225,7 +224,7 @@ internal class Guest(
private var localDowntime = 0L
private var localLastReport = clock.millis()
private var localBootTime: Instant? = null
- private val localCpuLimit = machine.model.cpus.sumOf { it.frequency }
+ private val localCpuLimit = machine.model.cpu.totalCapacity
/**
* Helper function to track the uptime and downtime of the guest.
diff --git a/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt b/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
index 77cd2291..b5bc66a9 100644
--- a/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
+++ b/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/SimHostTest.kt
@@ -38,10 +38,9 @@ import org.opendc.compute.service.driver.Host
import org.opendc.compute.service.driver.HostListener
import org.opendc.simulator.compute.SimBareMetalMachine
import org.opendc.simulator.compute.kernel.SimHypervisor
+import org.opendc.simulator.compute.model.Cpu
import org.opendc.simulator.compute.model.MachineModel
import org.opendc.simulator.compute.model.MemoryUnit
-import org.opendc.simulator.compute.model.ProcessingNode
-import org.opendc.simulator.compute.model.ProcessingUnit
import org.opendc.simulator.compute.workload.SimTrace
import org.opendc.simulator.compute.workload.SimTraceFragment
import org.opendc.simulator.flow2.FlowEngine
@@ -60,14 +59,18 @@ internal class SimHostTest {
@BeforeEach
fun setUp() {
- val cpuNode = ProcessingNode("Intel", "Xeon", "amd64", 2)
-
machineModel =
MachineModel(
- // cpus
- List(cpuNode.coreCount) { ProcessingUnit(cpuNode, it, 3200.0) },
+ Cpu(
+ 0,
+ 2,
+ 3200.0,
+ "Intel",
+ "Xeon",
+ "amd64",
+ ),
// memory
- List(4) { MemoryUnit("Crucial", "MTA18ASF4G72AZ-3G2B1", 3200.0, 32_000) },
+ MemoryUnit("Crucial", "MTA18ASF4G72AZ-3G2B1", 3200.0, 32_000 * 4),
)
}
@@ -102,11 +105,11 @@ internal class SimHostTest {
mapOf(
"workload" to
SimTrace.ofFragments(
- SimTraceFragment(0, duration * 1000, 2 * 28.0, 2),
- SimTraceFragment(duration * 1000, duration * 1000, 2 * 3500.0, 2),
+ SimTraceFragment(0, duration * 1000, 0.0, 2),
+ SimTraceFragment(duration * 1000, duration * 1000, 3200.0, 2),
SimTraceFragment(duration * 2000, duration * 1000, 0.0, 2),
- SimTraceFragment(duration * 3000, duration * 1000, 2 * 183.0, 2),
- ).createWorkload(1),
+ SimTraceFragment(duration * 3000, duration * 1000, 6500.0, 2),
+ ).createWorkload(0),
),
)
@@ -134,16 +137,16 @@ internal class SimHostTest {
}
// Ensure last cycle is collected
- delay(1000L * duration)
+// delay(1000L * duration)
host.close()
val cpuStats = host.getCpuStats()
assertAll(
- { assertEquals(347908, cpuStats.activeTime, "Active time does not match") },
- { assertEquals(2652092, cpuStats.idleTime, "Idle time does not match") },
- { assertEquals(1, cpuStats.stealTime, "Steal time does not match") },
- { assertEquals(1500000, timeSource.millis()) },
+ { assertEquals(450000, cpuStats.activeTime, "Active time does not match") },
+ { assertEquals(750000, cpuStats.idleTime, "Idle time does not match") },
+ { assertEquals(4688, cpuStats.stealTime, "Steal time does not match") },
+ { assertEquals(1200000, timeSource.millis()) },
)
}
@@ -178,11 +181,11 @@ internal class SimHostTest {
mapOf(
"workload" to
SimTrace.ofFragments(
- SimTraceFragment(0, duration * 1000, 2 * 28.0, 2),
- SimTraceFragment(duration * 1000, duration * 1000, 2 * 3500.0, 2),
+ SimTraceFragment(0, duration * 1000, 0.0, 2),
+ SimTraceFragment(duration * 1000, duration * 1000, 3200.0, 2),
SimTraceFragment(duration * 2000, duration * 1000, 0.0, 2),
- SimTraceFragment(duration * 3000, duration * 1000, 2 * 183.0, 2),
- ).createWorkload(1),
+ SimTraceFragment(duration * 3000, duration * 1000, 6500.0, 2),
+ ).createWorkload(0),
),
)
val vmImageB =
@@ -193,11 +196,11 @@ internal class SimHostTest {
mapOf(
"workload" to
SimTrace.ofFragments(
- SimTraceFragment(0, duration * 1000, 2 * 28.0, 2),
- SimTraceFragment(duration * 1000, duration * 1000, 2 * 3100.0, 2),
+ SimTraceFragment(0, duration * 1000, 0.0, 2),
+ SimTraceFragment(duration * 1000, duration * 1000, 3200.0, 2),
SimTraceFragment(duration * 2000, duration * 1000, 0.0, 2),
- SimTraceFragment(duration * 3000, duration * 1000, 2 * 73.0, 2),
- ).createWorkload(1),
+ SimTraceFragment(duration * 3000, duration * 1000, 6500.0, 2),
+ ).createWorkload(0),
),
)
@@ -237,9 +240,9 @@ internal class SimHostTest {
val cpuStats = host.getCpuStats()
assertAll(
- { assertEquals(629252, cpuStats.activeTime, "Active time does not match") },
- { assertEquals(2370748, cpuStats.idleTime, "Idle time does not match") },
- { assertEquals(18754, cpuStats.stealTime, "Steal time does not match") },
+ { assertEquals(600000, cpuStats.activeTime, "Active time does not match") },
+ { assertEquals(900000, cpuStats.idleTime, "Idle time does not match") },
+ { assertEquals(309375, cpuStats.stealTime, "Steal time does not match") },
{ assertEquals(1500000, timeSource.millis()) },
)
}
@@ -274,11 +277,11 @@ internal class SimHostTest {
mapOf(
"workload" to
SimTrace.ofFragments(
- SimTraceFragment(0, duration * 1000, 2 * 28.0, 2),
- SimTraceFragment(duration * 1000L, duration * 1000, 2 * 3500.0, 2),
- SimTraceFragment(duration * 2000L, duration * 1000, 0.0, 2),
- SimTraceFragment(duration * 3000L, duration * 1000, 2 * 183.0, 2),
- ).createWorkload(1),
+ SimTraceFragment(0, duration * 1000, 0.0, 2),
+ SimTraceFragment(duration * 1000, duration * 1000, 3200.0, 2),
+ SimTraceFragment(duration * 2000, duration * 1000, 0.0, 2),
+ SimTraceFragment(duration * 3000, duration * 1000, 6500.0, 2),
+ ).createWorkload(0),
),
)
val flavor = MockFlavor(2, 0)
@@ -318,8 +321,8 @@ internal class SimHostTest {
val guestSysStats = host.getSystemStats(server)
assertAll(
- { assertEquals(2062046, cpuStats.idleTime, "Idle time does not match") },
- { assertEquals(347954, cpuStats.activeTime, "Active time does not match") },
+ { assertEquals(755000, cpuStats.idleTime, "Idle time does not match") },
+ { assertEquals(450000, cpuStats.activeTime, "Active time does not match") },
{ assertEquals(1205000, sysStats.uptime.toMillis(), "Uptime does not match") },
{ assertEquals(300000, sysStats.downtime.toMillis(), "Downtime does not match") },
{ assertEquals(1205000, guestSysStats.uptime.toMillis(), "Guest uptime does not match") },
diff --git a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt
index a98a1a6d..56cda31c 100644
--- a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt
+++ b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/ComputeMetricReader.kt
@@ -258,7 +258,8 @@ public class ComputeMetricReader(
private val _host = host
- override val host: HostInfo = HostInfo(host.uid.toString(), host.name, "x86", host.model.cpuCount, host.model.memoryCapacity)
+ override val host: HostInfo =
+ HostInfo(host.uid.toString(), host.name, "x86", host.model.coreCount, host.model.cpuCapacity, host.model.memoryCapacity)
override val timestamp: Instant
get() = _timestamp
@@ -539,7 +540,15 @@ public class ComputeMetricReader(
val newHost = service.lookupHost(task)
if (newHost != null && newHost.uid != _host?.uid) {
_host = newHost
- host = HostInfo(newHost.uid.toString(), newHost.name, "x86", newHost.model.cpuCount, newHost.model.memoryCapacity)
+ host =
+ HostInfo(
+ newHost.uid.toString(),
+ newHost.name,
+ "x86",
+ newHost.model.coreCount,
+ newHost.model.cpuCapacity,
+ newHost.model.memoryCapacity,
+ )
}
val cpuStats = _host?.getCpuStats(task)
diff --git a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/DfltHostExportColumns.kt b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/DfltHostExportColumns.kt
index 68b5a664..261c5462 100644
--- a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/DfltHostExportColumns.kt
+++ b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/export/parquet/DfltHostExportColumns.kt
@@ -76,8 +76,8 @@ public object DfltHostExportColumns {
public val CPU_COUNT: ExportColumn<HostTableReader> =
ExportColumn(
- field = Types.required(INT32).named("cpu_count"),
- ) { it.host.cpuCount }
+ field = Types.required(INT32).named("core_count"),
+ ) { it.host.coreCount }
public val MEM_CAPACITY: ExportColumn<HostTableReader> =
ExportColumn(
diff --git a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostInfo.kt b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostInfo.kt
index 58b7853d..62b7ef0d 100644
--- a/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostInfo.kt
+++ b/opendc-compute/opendc-compute-telemetry/src/main/kotlin/org/opendc/compute/telemetry/table/HostInfo.kt
@@ -25,4 +25,11 @@ package org.opendc.compute.telemetry.table
/**
* Information about a host exposed to the telemetry service.
*/
-public data class HostInfo(val id: String, val name: String, val arch: String, val cpuCount: Int, val memCapacity: Long)
+public data class HostInfo(
+ val id: String,
+ val name: String,
+ val arch: String,
+ val coreCount: Int,
+ val coreSpeed: Double,
+ val memCapacity: Long,
+)
diff --git a/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt b/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt
index d4d4bfe3..e0fba34f 100644
--- a/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt
+++ b/opendc-compute/opendc-compute-topology/src/main/kotlin/org/opendc/compute/topology/TopologyFactories.kt
@@ -29,10 +29,9 @@ import org.opendc.compute.topology.specs.HostJSONSpec
import org.opendc.compute.topology.specs.HostSpec
import org.opendc.compute.topology.specs.TopologySpec
import org.opendc.simulator.compute.SimPsuFactories
+import org.opendc.simulator.compute.model.Cpu
import org.opendc.simulator.compute.model.MachineModel
import org.opendc.simulator.compute.model.MemoryUnit
-import org.opendc.simulator.compute.model.ProcessingNode
-import org.opendc.simulator.compute.model.ProcessingUnit
import org.opendc.simulator.compute.power.getPowerModel
import java.io.File
import java.io.InputStream
@@ -119,14 +118,20 @@ private fun HostJSONSpec.toHostSpecs(
clusterId: Int,
random: RandomGenerator,
): HostSpec {
- val unknownProcessingNode = ProcessingNode("unknown", "unknown", "unknown", cpu.coreCount)
- val units = List(cpu.count) { ProcessingUnit(unknownProcessingNode, globalCoreId++, cpu.coreSpeed.toMHz()) }
+ val units =
+ List(cpu.count) {
+ Cpu(
+ globalCoreId++,
+ cpu.coreCount,
+ cpu.coreSpeed.toMHz(),
+ )
+ }
val unknownMemoryUnit = MemoryUnit(memory.vendor, memory.modelName, memory.memorySpeed.toMHz(), memory.memorySize.toMiB().toLong())
val machineModel =
MachineModel(
units,
- listOf(unknownMemoryUnit),
+ unknownMemoryUnit,
)
val powerModel =