summaryrefslogtreecommitdiff
path: root/opendc-experiments/opendc-experiments-base/src
diff options
context:
space:
mode:
authorDante Niewenhuis <d.niewenhuis@hotmail.com>2024-11-26 11:09:21 +0100
committerGitHub <noreply@github.com>2024-11-26 11:09:21 +0100
commitec73210b675fd90568c5193e6ae6ef82ce81be6c (patch)
tree89b530b53898752f7800e5109548412b84fcd375 /opendc-experiments/opendc-experiments-base/src
parent698a64615d0eef8994fc1eaf0a3b71da194e1dcd (diff)
Streamlined the FlowNetwork for better performance (#273)
Diffstat (limited to 'opendc-experiments/opendc-experiments-base/src')
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt11
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt26
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt7
-rw-r--r--opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt8
4 files changed, 22 insertions, 30 deletions
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt
index e067bf45..f4df7991 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt
@@ -25,11 +25,9 @@
package org.opendc.experiments.base.runner
import com.github.ajalt.clikt.core.CliktCommand
-import com.github.ajalt.clikt.parameters.options.default
import com.github.ajalt.clikt.parameters.options.defaultLazy
import com.github.ajalt.clikt.parameters.options.option
import com.github.ajalt.clikt.parameters.types.file
-import com.github.ajalt.clikt.parameters.types.int
import org.opendc.experiments.base.experiment.getExperiment
import java.io.File
@@ -49,15 +47,8 @@ internal class ExperimentCommand : CliktCommand(name = "experiment") {
.file(canBeDir = false, canBeFile = true)
.defaultLazy { File("resources/experiment.json") }
- /**
- * The number of threads to use for parallelism.
- */
- private val parallelism by option("-p", "--parallelism", help = "number of worker threads")
- .int()
- .default(Runtime.getRuntime().availableProcessors() - 1)
-
override fun run() {
val experiment = getExperiment(scenarioPath)
- runExperiment(experiment, parallelism)
+ runExperiment(experiment)
}
}
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt
index 0b45806b..079db6fc 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt
@@ -22,35 +22,39 @@
package org.opendc.experiments.base.runner
+import me.tongfei.progressbar.ProgressBarBuilder
+import me.tongfei.progressbar.ProgressBarStyle
import org.opendc.experiments.base.experiment.Scenario
-import java.util.concurrent.ForkJoinPool
/**
* Run scenario when no pool is available for parallel execution
*
* @param experiment The scenarios to run
- * @param parallelism The number of scenarios that can be run in parallel
*/
-public fun runExperiment(
- experiment: List<Scenario>,
- parallelism: Int,
-) {
+public fun runExperiment(experiment: List<Scenario>) {
val ansiReset = "\u001B[0m"
val ansiGreen = "\u001B[32m"
val ansiBlue = "\u001B[34m"
setupOutputFolderStructure(experiment[0].outputFolder)
+ val pb =
+ ProgressBarBuilder().setInitialMax(experiment.sumOf { scenario -> scenario.runs.toLong() })
+ .setStyle(ProgressBarStyle.ASCII)
+ .setTaskName("Simulating...").build()
+
for (scenario in experiment) {
- val pool = ForkJoinPool(parallelism)
println(
"\n\n$ansiGreen================================================================================$ansiReset",
)
println("$ansiBlue Running scenario: ${scenario.name} $ansiReset")
println("$ansiGreen================================================================================$ansiReset")
- runScenario(
- scenario,
- pool,
- )
+
+ for (seed in 0..<scenario.runs) {
+ println("$ansiBlue Starting seed: $seed $ansiReset")
+ runScenario(scenario, seed.toLong())
+ pb.step()
+ }
}
+ pb.close()
}
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 4d6069e4..30c129c2 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
@@ -47,16 +47,13 @@ import java.util.stream.LongStream
* The scenario is run multiple times based on the user input
*
* @param scenario The scenario to run
- * @param pool The pool on which to run the scenarios
*/
-public fun runScenario(
- scenario: Scenario,
- pool: ForkJoinPool,
-) {
+public fun runScenario(scenario: Scenario) {
val pb =
ProgressBarBuilder().setInitialMax(scenario.runs.toLong()).setStyle(ProgressBarStyle.ASCII)
.setTaskName("Simulating...").build()
+ val pool = ForkJoinPool(5)
pool.submit {
LongStream.range(0, scenario.runs.toLong()).parallel().forEach {
runScenario(scenario, scenario.initialSeed + it)
diff --git a/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt b/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt
index abf16fef..17d62b1a 100644
--- a/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt
+++ b/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt
@@ -294,8 +294,8 @@ class ScenarioIntegrationTest {
// Note that these values have been verified beforehand
assertAll(
- { assertEquals(1803918472, monitor.idleTime) { "Idle time incorrect" } },
- { assertEquals(787181528, monitor.activeTime) { "Active time incorrect" } },
+ { assertEquals(1803918473, monitor.idleTime) { "Idle time incorrect" } },
+ { assertEquals(787181527, monitor.activeTime) { "Active time incorrect" } },
{ assertEquals(0, monitor.stealTime) { "Steal time incorrect" } },
{ assertEquals(0, monitor.lostTime) { "Lost time incorrect" } },
{ assertEquals(6.7565629E8, monitor.energyUsage, 1E4) { "Incorrect energy usage" } },
@@ -341,8 +341,8 @@ class ScenarioIntegrationTest {
{ assertEquals(0, monitor.tasksActive, "All VMs should finish after a run") },
{ assertEquals(0, monitor.attemptsFailure, "No VM should be unscheduled") },
{ assertEquals(0, monitor.tasksPending, "No VM should not be in the queue") },
- { assertEquals(43101793092, monitor.idleTime) { "Incorrect idle time" } },
- { assertEquals(3489406908, monitor.activeTime) { "Incorrect active time" } },
+ { assertEquals(43101787433, monitor.idleTime) { "Incorrect idle time" } },
+ { assertEquals(3489412567, monitor.activeTime) { "Incorrect active time" } },
{ assertEquals(0, monitor.stealTime) { "Incorrect steal time" } },
{ assertEquals(0, monitor.lostTime) { "Incorrect lost time" } },
{ assertEquals(1.0016123392181786E10, monitor.energyUsage, 1E4) { "Incorrect energy usage" } },