diff options
Diffstat (limited to 'opendc-experiments/opendc-experiments-base/src')
7 files changed, 48 insertions, 41 deletions
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ExperimentSpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ExperimentSpec.kt index df0a862d..71ab4002 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ExperimentSpec.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ExperimentSpec.kt @@ -23,10 +23,7 @@ package org.opendc.experiments.base.experiment.specs import kotlinx.serialization.Serializable -import org.opendc.common.logger.infoNewLine -import org.opendc.common.logger.logger import org.opendc.compute.simulator.scheduler.ComputeSchedulerEnum -import org.opendc.compute.simulator.telemetry.parquet.ComputeExportConfig import org.opendc.experiments.base.experiment.specs.allocation.AllocationPolicySpec import org.opendc.experiments.base.experiment.specs.allocation.PrefabAllocationPolicySpec import java.util.UUID @@ -42,25 +39,22 @@ import java.util.UUID * @property outputFolder * @property initialSeed * @property runs - * @property computeExportConfig configures which parquet columns are to * be included in the output files. */ @Serializable public data class ExperimentSpec( - var id: Int = -1, var name: String = "", val outputFolder: String = "output", val initialSeed: Int = 0, val runs: Int = 1, - val exportModels: Set<ExportModelSpec> = setOf(ExportModelSpec()), - val computeExportConfig: ComputeExportConfig = ComputeExportConfig.ALL_COLUMNS, - val maxNumFailures: Set<Int> = setOf(10), val topologies: Set<ScenarioTopologySpec>, val workloads: Set<WorkloadSpec>, val allocationPolicies: Set<AllocationPolicySpec> = setOf(PrefabAllocationPolicySpec(ComputeSchedulerEnum.Mem)), val failureModels: Set<FailureModelSpec?> = setOf(null), + val maxNumFailures: Set<Int> = setOf(10), val checkpointModels: Set<CheckpointModelSpec?> = setOf(null), + val exportModels: Set<ExportModelSpec> = setOf(ExportModelSpec()), ) { init { require(runs > 0) { "The number of runs should always be positive" } @@ -71,8 +65,6 @@ public data class ExperimentSpec( name = "unnamed-simulation-${UUID.randomUUID().toString().substring(0, 4)}" // "workload=${workloads[0].name}_topology=${topologies[0].name}_allocationPolicy=${allocationPolicies[0].name}" } - - LOG.infoNewLine(computeExportConfig.fmt()) } public fun getCartesian(): Sequence<ScenarioSpec> { @@ -96,7 +88,6 @@ public data class ExperimentSpec( for (i in 0 until numScenarios) { yield( ScenarioSpec( - id, name, outputFolder, topologyList[(i / topologyDiv) % topologyList.size], @@ -111,8 +102,4 @@ public data class ExperimentSpec( } } } - - internal companion object { - private val LOG by logger() - } } diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ExportModelSpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ExportModelSpec.kt index 6d1ee0f0..4230f9aa 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ExportModelSpec.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ExportModelSpec.kt @@ -23,8 +23,11 @@ package org.opendc.experiments.base.experiment.specs import kotlinx.serialization.Serializable +import org.opendc.common.logger.infoNewLine +import org.opendc.common.logger.logger import org.opendc.compute.simulator.telemetry.OutputFiles import org.opendc.compute.simulator.telemetry.parquet.ComputeExportConfig +import kotlin.getValue /** * specification describing how the results should be exported @@ -34,10 +37,10 @@ import org.opendc.compute.simulator.telemetry.parquet.ComputeExportConfig @Serializable public data class ExportModelSpec( val exportInterval: Long = 5 * 60, + var printFrequency: Int? = 24, val computeExportConfig: ComputeExportConfig = ComputeExportConfig.ALL_COLUMNS, val filesToExport: List<OutputFiles> = OutputFiles.entries.toList(), var filesToExportDict: MutableMap<OutputFiles, Boolean> = OutputFiles.entries.associateWith { false }.toMutableMap(), - var printFrequency: Int? = 24, ) { init { require(exportInterval > 0) { "The Export interval has to be higher than 0" } @@ -47,5 +50,11 @@ public data class ExportModelSpec( for (file in filesToExport) { filesToExportDict[file] = true } + + LOG.infoNewLine(computeExportConfig.fmt()) + } + + internal companion object { + private val LOG by logger() } } diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ScenarioSpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ScenarioSpec.kt index d9df6511..6025eaa8 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ScenarioSpec.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/ScenarioSpec.kt @@ -30,7 +30,6 @@ import org.opendc.experiments.base.experiment.specs.allocation.TaskStopperSpec @Serializable public data class ScenarioSpec( - var id: Int = -1, var name: String = "", val outputFolder: String = "output", val topology: ScenarioTopologySpec, diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/AllocationPolicySpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/AllocationPolicySpec.kt index bc96562c..8ea0a31e 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/AllocationPolicySpec.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/AllocationPolicySpec.kt @@ -52,16 +52,16 @@ public data class PrefabAllocationPolicySpec( @Serializable @SerialName("filter") public data class FilterAllocationPolicySpec( - val filters: List<HostFilterSpec>, - val weighers: List<HostWeigherSpec>, + val filters: List<HostFilterSpec> = listOf(ComputeFilterSpec()), + val weighers: List<HostWeigherSpec> = emptyList(), val subsetSize: Int = 1, ) : AllocationPolicySpec @Serializable @SerialName("timeshift") public data class TimeShiftAllocationPolicySpec( - val filters: List<HostFilterSpec>, - val weighers: List<HostWeigherSpec>, + val filters: List<HostFilterSpec> = listOf(ComputeFilterSpec()), + val weighers: List<HostWeigherSpec> = emptyList(), val windowSize: Int = 168, val subsetSize: Int = 1, val forecast: Boolean = true, @@ -110,10 +110,10 @@ public fun createComputeScheduler( @Serializable @SerialName("taskstopper") public data class TaskStopperSpec( + val windowSize: Int = 168, val forecast: Boolean = true, val forecastThreshold: Double = 0.6, val forecastSize: Int = 24, - val windowSize: Int = 168, ) public fun createTaskStopper( diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/HostFilterSpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/HostFilterSpec.kt index 6a0ed2b8..1ae88d3c 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/HostFilterSpec.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/HostFilterSpec.kt @@ -60,6 +60,12 @@ public data class ComputeFilterSpec( ) : HostFilterSpec() @Serializable +@SerialName("SameHost") +public data class SameHostHostFilterSpec( + val filterName: HostFilterEnum = HostFilterEnum.SameHost, +) : HostFilterSpec() + +@Serializable @SerialName("DifferentHost") public data class DifferentHostFilterSpec( val filterName: HostFilterEnum = HostFilterEnum.DifferentHost, @@ -80,12 +86,6 @@ public data class RamHostFilterSpec( ) : HostFilterSpec() @Serializable -@SerialName("SameHost") -public data class SameHostHostFilterSpec( - val filterName: HostFilterEnum = HostFilterEnum.SameHost, -) : HostFilterSpec() - -@Serializable @SerialName("VCpuCapacity") public data class VCpuCapacityHostFilterSpec( val filterName: HostFilterEnum = HostFilterEnum.VCpuCapacity, @@ -101,10 +101,10 @@ public data class VCpuHostFilterSpec( public fun createHostFilter(filterSpec: HostFilterSpec): HostFilter { return when (filterSpec) { is ComputeFilterSpec -> ComputeFilter() + is SameHostHostFilterSpec -> SameHostFilter() is DifferentHostFilterSpec -> DifferentHostFilter() is InstanceCountHostFilterSpec -> InstanceCountFilter(filterSpec.limit) is RamHostFilterSpec -> RamFilter(filterSpec.allocationRatio) - is SameHostHostFilterSpec -> SameHostFilter() is VCpuCapacityHostFilterSpec -> VCpuCapacityFilter() is VCpuHostFilterSpec -> VCpuFilter(filterSpec.allocationRatio) } diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/HostWeigherSpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/HostWeigherSpec.kt index 60f5ff8b..819f3ae2 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/HostWeigherSpec.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/allocation/HostWeigherSpec.kt @@ -42,40 +42,40 @@ import org.opendc.compute.simulator.scheduler.weights.VCpuWeigher public sealed class HostWeigherSpec @Serializable +@SerialName("Ram") +public data class RamWeigherSpec( + val multiplier: Double = 1.0, +) : HostWeigherSpec() + +@Serializable @SerialName("CoreRam") public data class CoreRamWeigherSpec( - val multiplier: Double, + val multiplier: Double = 1.0, ) : HostWeigherSpec() @Serializable @SerialName("InstanceCount") public data class InstanceCountWeigherSpec( - val multiplier: Double, -) : HostWeigherSpec() - -@Serializable -@SerialName("Ram") -public data class RamWeigherSpec( - val multiplier: Double, + val multiplier: Double = 1.0, ) : HostWeigherSpec() @Serializable @SerialName("VCpuCapacity") public data class VCpuCapacityWeigherSpec( - val multiplier: Double, + val multiplier: Double = 1.0, ) : HostWeigherSpec() @Serializable @SerialName("VCpu") public data class VCpuWeigherSpec( - val multiplier: Double, + val multiplier: Double = 1.0, ) : HostWeigherSpec() public fun createHostWeigher(weigherSpec: HostWeigherSpec): HostWeigher { return when (weigherSpec) { + is RamWeigherSpec -> RamWeigher(weigherSpec.multiplier) is CoreRamWeigherSpec -> CoreRamWeigher(weigherSpec.multiplier) is InstanceCountWeigherSpec -> InstanceCountWeigher(weigherSpec.multiplier) - is RamWeigherSpec -> RamWeigher(weigherSpec.multiplier) is VCpuCapacityWeigherSpec -> VCpuCapacityWeigher(weigherSpec.multiplier) is VCpuWeigherSpec -> VCpuWeigher(weigherSpec.multiplier) } diff --git a/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ExperimentTest.kt b/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ExperimentTest.kt index 2fb5ece8..d4729350 100644 --- a/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ExperimentTest.kt +++ b/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ExperimentTest.kt @@ -25,6 +25,10 @@ package org.opendc.experiments.base import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertAll +import org.opendc.compute.simulator.scheduler.MemorizingScheduler +import org.opendc.compute.simulator.scheduler.filters.ComputeFilter +import org.opendc.compute.simulator.scheduler.filters.RamFilter +import org.opendc.compute.simulator.scheduler.filters.VCpuFilter import org.opendc.compute.workload.Task import org.opendc.simulator.compute.workload.trace.TraceFragment import java.util.ArrayList @@ -101,7 +105,15 @@ class ExperimentTest { val topology = createTopology("single_1_2000.json") - val monitor = runTest(topology, workload) + val monitor = + runTest( + topology, + workload, + computeScheduler = + MemorizingScheduler( + filters = listOf(ComputeFilter(), VCpuFilter(1.0), RamFilter(1.0)), + ), + ) assertAll( { assertEquals(15 * 60 * 1000, monitor.maxTimestamp) { "Total runtime incorrect" } }, |
