diff options
Diffstat (limited to 'opendc-experiments/opendc-experiments-base/src/main')
4 files changed, 40 insertions, 32 deletions
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt index 9029691a..bd4b5cc9 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt @@ -46,6 +46,7 @@ public data class Scenario( val workload: WorkloadSpec, val allocationPolicy: AllocationPolicySpec, val failureModel: FailureModel?, + val carbonTracePath: String? = null, val exportModel: ExportModelSpec = ExportModelSpec(), val outputFolder: String = "output", val name: String = "", diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt index 56076f52..05fa762e 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt @@ -31,7 +31,6 @@ import org.opendc.compute.topology.clusterTopology import org.opendc.compute.topology.specs.TopologyJSONSpec import org.opendc.experiments.base.models.scenario.specs.ScenarioSpec import java.io.File -import java.util.UUID private val scenarioReader = ScenarioReader() @@ -73,7 +72,6 @@ public fun getScenario(scenarioSpec: ScenarioSpec): List<Scenario> { * @return A list of Scenarios. */ public fun getScenarioCombinations(scenarioSpec: ScenarioSpec): List<Scenario> { - val topologies = getTopologies(scenarioSpec.topologies) val topologiesSpec = scenarioSpec.topologies val workloads = scenarioSpec.workloads val allocationPolicies = scenarioSpec.allocationPolicies @@ -85,20 +83,23 @@ public fun getScenarioCombinations(scenarioSpec: ScenarioSpec): List<Scenario> { for (workload in workloads) { for (allocationPolicy in allocationPolicies) { for (failureModel in failureModels) { - for (exportModel in exportModels) { - val scenario = - Scenario( - topology = clusterTopology(File(topology.pathToFile)), - workload = workload, - allocationPolicy = allocationPolicy, - failureModel = getFailureModel(failureModel.failureInterval), - exportModel = exportModel, - outputFolder = scenarioSpec.outputFolder, - name = getOutputFolderName(scenarioSpec, topology, workload, allocationPolicy), - runs = scenarioSpec.runs, - initialSeed = scenarioSpec.initialSeed, - ) - scenarios.add(scenario) + for (carbonTracePath in scenarioSpec.carbonTracePaths) { + for (exportModel in exportModels) { + val scenario = + Scenario( + topology = clusterTopology(File(topology.pathToFile)), + workload = workload, + allocationPolicy = allocationPolicy, + failureModel = getFailureModel(failureModel.failureInterval), + carbonTracePath = carbonTracePath, + exportModel = exportModel, + outputFolder = scenarioSpec.outputFolder, + name = getOutputFolderName(scenarioSpec, topology, workload, allocationPolicy), + runs = scenarioSpec.runs, + initialSeed = scenarioSpec.initialSeed, + ) + scenarios.add(scenario) + } } } } @@ -139,8 +140,7 @@ public fun getOutputFolderName( allocationPolicy: AllocationPolicySpec, ): String { return "scenario=${scenarioSpec.name}" + - "-topology=${topology.pathToFile}" + - "-workload=${workload.name}}" + - "-scheduler=${allocationPolicy.name}" + - "-${UUID.randomUUID().toString().substring(0, 8)}" + "-topology=${topology.name}" + + "-workload=${workload.name}" + + "-scheduler=${allocationPolicy.name}" } diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt index 5f9aec4a..15012461 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt @@ -47,6 +47,7 @@ public data class ScenarioSpec( val workloads: List<WorkloadSpec>, val allocationPolicies: List<AllocationPolicySpec>, val failureModels: List<FailureModelSpec> = listOf(FailureModelSpec()), + val carbonTracePaths: List<String?> = listOf(null), val exportModels: List<ExportModelSpec> = listOf(ExportModelSpec()), val outputFolder: String = "output", val initialSeed: Int = 0, @@ -57,6 +58,7 @@ public data class ScenarioSpec( require(runs > 0) { "The number of runs should always be positive" } // generate name if not provided + // TODO: improve this if (name == "") { name = "workload=${workloads[0].name}_topology=${topologies[0].name}_allocationPolicy=${allocationPolicies[0].name}" diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt index 63853d33..734cdacc 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt @@ -25,6 +25,8 @@ package org.opendc.experiments.base.runner import getWorkloadType import me.tongfei.progressbar.ProgressBarBuilder import me.tongfei.progressbar.ProgressBarStyle +import org.opendc.compute.carbon.CarbonTrace +import org.opendc.compute.carbon.getCarbonTrace import org.opendc.compute.service.ComputeService import org.opendc.compute.service.scheduler.ComputeSchedulerEnum import org.opendc.compute.service.scheduler.createComputeScheduler @@ -55,7 +57,7 @@ public fun runScenario( val ansiReset = "\u001B[0m" val ansiGreen = "\u001B[32m" val ansiBlue = "\u001B[34m" - clearOutputFolder() + clearOutputFolder(scenarios[0].outputFolder) for (scenario in scenarios) { val pool = ForkJoinPool(parallelism) @@ -116,14 +118,12 @@ public fun runScenario( setupHosts(serviceDomain, scenario.topology, optimize = true), ) - val partition = scenario.name + "/seed=$seed" val workloadLoader = ComputeWorkloadLoader(File(scenario.workload.pathToFile)) val vms = getWorkloadType(scenario.workload.type).resolve(workloadLoader, Random(seed)) - val startTime = Duration.ofMillis(vms.minOf { it.startTime }.toEpochMilli()) - // saveInSeedFolder(provisioner, serviceDomain, scenario, seed, partition, startTime) - // XOR - saveInOutputFolder(provisioner, serviceDomain, scenario, startTime) + val carbonTrace = getCarbonTrace(scenario.carbonTracePath) + val startTime = Duration.ofMillis(vms.minOf { it.startTime }.toEpochMilli()) + saveInOutputFolder(provisioner, serviceDomain, scenario, seed, startTime, carbonTrace) val service = provisioner.registry.resolve(serviceDomain, ComputeService::class.java)!! service.replay(timeSource, vms, seed, failureModel = scenario.failureModel) @@ -168,32 +168,37 @@ public fun saveInSeedFolder( * @param provisioner The provisioner used to setup and run the simulation. * @param serviceDomain The domain of the compute service. * @param scenario The scenario being run. - * @param startTime The start time of the simulation. + * @param seed The seed of the current run + * @param startTime The start time of the simulation given by the workload trace. + * @param carbonTrace The carbon trace used to determine carbon emissions. */ public fun saveInOutputFolder( provisioner: Provisioner, serviceDomain: String, scenario: Scenario, + seed: Long, startTime: Duration, + carbonTrace: CarbonTrace, ) { provisioner.runStep( registerComputeMonitor( serviceDomain, ParquetComputeMonitor( - File("output/simulation-results/"), - scenario.name, + File("${scenario.outputFolder}/${scenario.name}"), + "seed=$seed", bufferSize = 4096, ), Duration.ofSeconds(scenario.exportModel.exportInterval), startTime, + carbonTrace, ), ) } /** - * Utilitary function, in case we want to delete the previous simulation results. + * Utility function, in case we want to delete the previous simulation results. + * @param outputFolderPath The output folder to remove */ -public fun clearOutputFolder() { - val outputFolderPath = "output/simulation-results/" +public fun clearOutputFolder(outputFolderPath: String) { if (File(outputFolderPath).exists()) File(outputFolderPath).deleteRecursively() } |
