summaryrefslogtreecommitdiff
path: root/opendc-experiments
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-experiments')
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt6
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/CapelinRunner.kt2
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/model/Topology.kt2
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt71
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt12
-rw-r--r--opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/HostSpec.kt4
-rw-r--r--opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/Topology.kt33
7 files changed, 46 insertions, 84 deletions
diff --git a/opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt b/opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt
index db56f75d..f021e223 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/jmh/kotlin/org/opendc/experiments/capelin/CapelinBenchmarks.kt
@@ -30,7 +30,7 @@ import org.opendc.compute.service.scheduler.filters.VCpuFilter
import org.opendc.compute.service.scheduler.weights.CoreRamWeigher
import org.opendc.experiments.capelin.topology.clusterTopology
import org.opendc.experiments.compute.*
-import org.opendc.experiments.compute.topology.Topology
+import org.opendc.experiments.compute.topology.HostSpec
import org.opendc.experiments.provisioner.Provisioner
import org.opendc.simulator.core.runBlockingSimulation
import org.openjdk.jmh.annotations.*
@@ -47,7 +47,7 @@ import java.util.concurrent.TimeUnit
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
class CapelinBenchmarks {
private lateinit var vms: List<VirtualMachine>
- private lateinit var topology: Topology
+ private lateinit var topology: List<HostSpec>
@Param("true", "false")
private var isOptimized: Boolean = false
@@ -71,7 +71,7 @@ class CapelinBenchmarks {
provisioner.runSteps(
setupComputeService(serviceDomain, { computeScheduler }),
- setupHosts(serviceDomain, topology.resolve(), optimize = isOptimized)
+ setupHosts(serviceDomain, topology, optimize = isOptimized)
)
val service = provisioner.registry.resolve(serviceDomain, ComputeService::class.java)!!
diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/CapelinRunner.kt b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/CapelinRunner.kt
index e019af34..f1214b08 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/CapelinRunner.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/CapelinRunner.kt
@@ -61,7 +61,7 @@ public class CapelinRunner(
Provisioner(coroutineContext, clock, seed).use { provisioner ->
provisioner.runSteps(
setupComputeService(serviceDomain, { createComputeScheduler(scenario.allocationPolicy, Random(it.seeder.nextLong())) }),
- setupHosts(serviceDomain, topology.resolve(), optimize = true)
+ setupHosts(serviceDomain, topology, optimize = true)
)
if (outputPath != null) {
diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/model/Topology.kt b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/model/Topology.kt
index fe16a294..c90194ce 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/model/Topology.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/model/Topology.kt
@@ -23,6 +23,6 @@
package org.opendc.experiments.capelin.model
/**
- * The topology topology on which we test the workload.
+ * The topology on which we simulate the workload.
*/
public data class Topology(val name: String)
diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt
index d152a6db..054adfcd 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt
@@ -24,7 +24,6 @@
package org.opendc.experiments.capelin.topology
import org.opendc.experiments.compute.topology.HostSpec
-import org.opendc.experiments.compute.topology.Topology
import org.opendc.simulator.compute.model.MachineModel
import org.opendc.simulator.compute.model.MemoryUnit
import org.opendc.simulator.compute.model.ProcessingNode
@@ -43,61 +42,55 @@ import kotlin.math.roundToLong
private val reader = ClusterSpecReader()
/**
- * Construct a [Topology] from the specified [file].
+ * Construct a topology from the specified [file].
*/
fun clusterTopology(
file: File,
powerModel: PowerModel = LinearPowerModel(350.0, idlePower = 200.0),
random: Random = Random(0)
-): Topology = clusterTopology(reader.read(file), powerModel, random)
+): List<HostSpec> {
+ return clusterTopology(reader.read(file), powerModel, random)
+}
/**
- * Construct a [Topology] from the specified [input].
+ * Construct a topology from the specified [input].
*/
fun clusterTopology(
input: InputStream,
powerModel: PowerModel = LinearPowerModel(350.0, idlePower = 200.0),
random: Random = Random(0)
-): Topology = clusterTopology(reader.read(input), powerModel, random)
+): List<HostSpec> {
+ return clusterTopology(reader.read(input), powerModel, random)
+}
/**
- * Construct a [Topology] from the given list of [clusters].
+ * Construct a topology from the given list of [clusters].
*/
-fun clusterTopology(
- clusters: List<ClusterSpec>,
- powerModel: PowerModel,
- random: Random = Random(0)
-): Topology {
- return object : Topology {
- override fun resolve(): List<HostSpec> {
- val hosts = mutableListOf<HostSpec>()
- for (cluster in clusters) {
- val cpuSpeed = cluster.cpuSpeed
- val memoryPerHost = cluster.memCapacityPerHost.roundToLong()
-
- val unknownProcessingNode = ProcessingNode("unknown", "unknown", "unknown", cluster.cpuCountPerHost)
- val unknownMemoryUnit = MemoryUnit("unknown", "unknown", -1.0, memoryPerHost)
- val machineModel = MachineModel(
- List(cluster.cpuCountPerHost) { coreId -> ProcessingUnit(unknownProcessingNode, coreId, cpuSpeed) },
- listOf(unknownMemoryUnit)
- )
-
- repeat(cluster.hostCount) {
- val spec = HostSpec(
- UUID(random.nextLong(), it.toLong()),
- "node-${cluster.name}-$it",
- mapOf("cluster" to cluster.id),
- machineModel,
- SimplePowerDriver(powerModel)
- )
+fun clusterTopology(clusters: List<ClusterSpec>, powerModel: PowerModel, random: Random = Random(0)): List<HostSpec> {
+ return clusters.flatMap { it.toHostSpecs(random, powerModel) }
+}
- hosts += spec
- }
- }
+/**
+ * Helper method to convert a [ClusterSpec] into a list of [HostSpec]s.
+ */
+private fun ClusterSpec.toHostSpecs(random: Random, powerModel: PowerModel): List<HostSpec> {
+ val cpuSpeed = cpuSpeed
+ val memoryPerHost = memCapacityPerHost.roundToLong()
- return hosts
- }
+ val unknownProcessingNode = ProcessingNode("unknown", "unknown", "unknown", cpuCountPerHost)
+ val unknownMemoryUnit = MemoryUnit("unknown", "unknown", -1.0, memoryPerHost)
+ val machineModel = MachineModel(
+ List(cpuCountPerHost) { coreId -> ProcessingUnit(unknownProcessingNode, coreId, cpuSpeed) },
+ listOf(unknownMemoryUnit)
+ )
- override fun toString(): String = "ClusterSpecTopology"
+ return List(hostCount) {
+ HostSpec(
+ UUID(random.nextLong(), it.toLong()),
+ "node-$name-$it",
+ mapOf("cluster" to id),
+ machineModel,
+ SimplePowerDriver(powerModel)
+ )
}
}
diff --git a/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt b/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt
index ae1ca807..9be2d522 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt
@@ -37,7 +37,7 @@ import org.opendc.experiments.compute.*
import org.opendc.experiments.compute.telemetry.ComputeMonitor
import org.opendc.experiments.compute.telemetry.table.HostTableReader
import org.opendc.experiments.compute.telemetry.table.ServiceTableReader
-import org.opendc.experiments.compute.topology.Topology
+import org.opendc.experiments.compute.topology.HostSpec
import org.opendc.experiments.provisioner.Provisioner
import org.opendc.simulator.core.runBlockingSimulation
import java.io.File
@@ -90,7 +90,7 @@ class CapelinIntegrationTest {
provisioner.runSteps(
setupComputeService(serviceDomain = "compute.opendc.org", { computeScheduler }),
registerComputeMonitor(serviceDomain = "compute.opendc.org", monitor),
- setupHosts(serviceDomain = "compute.opendc.org", topology.resolve()),
+ setupHosts(serviceDomain = "compute.opendc.org", topology),
)
val service = provisioner.registry.resolve("compute.opendc.org", ComputeService::class.java)!!
@@ -134,7 +134,7 @@ class CapelinIntegrationTest {
provisioner.runSteps(
setupComputeService(serviceDomain = "compute.opendc.org", { computeScheduler }),
registerComputeMonitor(serviceDomain = "compute.opendc.org", monitor),
- setupHosts(serviceDomain = "compute.opendc.org", topology.resolve()),
+ setupHosts(serviceDomain = "compute.opendc.org", topology),
)
val service = provisioner.registry.resolve("compute.opendc.org", ComputeService::class.java)!!
@@ -173,7 +173,7 @@ class CapelinIntegrationTest {
provisioner.runSteps(
setupComputeService(serviceDomain = "compute.opendc.org", { computeScheduler }),
registerComputeMonitor(serviceDomain = "compute.opendc.org", monitor),
- setupHosts(serviceDomain = "compute.opendc.org", topology.resolve()),
+ setupHosts(serviceDomain = "compute.opendc.org", topology),
)
val service = provisioner.registry.resolve("compute.opendc.org", ComputeService::class.java)!!
@@ -212,7 +212,7 @@ class CapelinIntegrationTest {
provisioner.runSteps(
setupComputeService(serviceDomain = "compute.opendc.org", { computeScheduler }),
registerComputeMonitor(serviceDomain = "compute.opendc.org", monitor),
- setupHosts(serviceDomain = "compute.opendc.org", topology.resolve()),
+ setupHosts(serviceDomain = "compute.opendc.org", topology),
)
val service = provisioner.registry.resolve("compute.opendc.org", ComputeService::class.java)!!
@@ -240,7 +240,7 @@ class CapelinIntegrationTest {
/**
* Obtain the topology factory for the test.
*/
- private fun createTopology(name: String = "topology"): Topology {
+ private fun createTopology(name: String = "topology"): List<HostSpec> {
val stream = checkNotNull(object {}.javaClass.getResourceAsStream("/env/$name.txt"))
return stream.use { clusterTopology(stream) }
}
diff --git a/opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/HostSpec.kt b/opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/HostSpec.kt
index c0ac0fbf..8ade963a 100644
--- a/opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/HostSpec.kt
+++ b/opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/HostSpec.kt
@@ -23,7 +23,9 @@
package org.opendc.experiments.compute.topology
import org.opendc.simulator.compute.model.MachineModel
+import org.opendc.simulator.compute.power.LinearPowerModel
import org.opendc.simulator.compute.power.PowerDriver
+import org.opendc.simulator.compute.power.SimplePowerDriver
import org.opendc.simulator.flow.mux.FlowMultiplexerFactory
import java.util.*
@@ -42,6 +44,6 @@ public data class HostSpec(
val name: String,
val meta: Map<String, Any>,
val model: MachineModel,
- val powerDriver: PowerDriver,
+ val powerDriver: PowerDriver = SimplePowerDriver(LinearPowerModel(350.0, idlePower = 200.0)),
val multiplexerFactory: FlowMultiplexerFactory = FlowMultiplexerFactory.maxMinMultiplexer()
)
diff --git a/opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/Topology.kt b/opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/Topology.kt
deleted file mode 100644
index bd29110f..00000000
--- a/opendc-experiments/opendc-experiments-compute/src/main/kotlin/org/opendc/experiments/compute/topology/Topology.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.experiments.compute.topology
-
-/**
- * Representation of the environment of the compute service, describing the physical details of every host.
- */
-public interface Topology {
- /**
- * Resolve the [Topology] into a list of [HostSpec]s.
- */
- public fun resolve(): List<HostSpec>
-}