diff options
| author | Georgios Andreadis <info@gandreadis.com> | 2020-03-11 16:11:43 +0100 |
|---|---|---|
| committer | Georgios Andreadis <info@gandreadis.com> | 2020-03-11 16:11:43 +0100 |
| commit | 224faa406b136e42b0406ab55425d382acc54fee (patch) | |
| tree | 1f23f1970cfde81b80e925ce42dfb7fad5ddb96b /opendc | |
| parent | 0655127dcd945289f045d8e04304e6a050e2a2f9 (diff) | |
feat: Pass all relevant SC20 parameters as arguments
This also includes a list of selected VMs, with the aim of only running those (for workload intensity sampling).
Diffstat (limited to 'opendc')
4 files changed, 74 insertions, 46 deletions
diff --git a/opendc/opendc-experiments-sc20/build.gradle.kts b/opendc/opendc-experiments-sc20/build.gradle.kts index 348f6f77..0c0b8bac 100644 --- a/opendc/opendc-experiments-sc20/build.gradle.kts +++ b/opendc/opendc-experiments-sc20/build.gradle.kts @@ -38,6 +38,8 @@ dependencies { api(project(":opendc:opendc-core")) implementation(project(":opendc:opendc-format")) implementation(kotlin("stdlib")) + implementation("com.xenomachina:kotlin-argparser:2.0.7") + api("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.8") runtimeOnly(project(":odcsim:odcsim-engine-omega")) testImplementation("org.junit.jupiter:junit-jupiter-api:${Library.JUNIT_JUPITER}") diff --git a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20HypervisorMonitor.kt b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20HypervisorMonitor.kt index 55a0ce75..90874ea3 100644 --- a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20HypervisorMonitor.kt +++ b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20HypervisorMonitor.kt @@ -8,8 +8,10 @@ import java.io.BufferedWriter import java.io.Closeable import java.io.FileWriter -class Sc20HypervisorMonitor : HypervisorMonitor, Closeable { - private val outputFile = BufferedWriter(FileWriter("sc20-experiment-results.csv")) +class Sc20HypervisorMonitor( + destination: String +) : HypervisorMonitor, Closeable { + private val outputFile = BufferedWriter(FileWriter(destination)) init { outputFile.write("time,requestedBurst,grantedBurst,numberOfDeployedImages,server,hostUsage,powerDraw\n") diff --git a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt index b48abf2e..0bc773be 100644 --- a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt +++ b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt @@ -36,6 +36,10 @@ import com.atlarge.opendc.compute.virt.service.allocation.AvailableMemoryAllocat import com.atlarge.opendc.format.environment.sc20.Sc20ClusterEnvironmentReader import com.atlarge.opendc.format.trace.sc20.Sc20PerformanceInterferenceReader import com.atlarge.opendc.format.trace.sc20.Sc20TraceReader +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import com.xenomachina.argparser.ArgParser +import com.xenomachina.argparser.default import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -43,59 +47,69 @@ import java.io.File import java.util.ServiceLoader import kotlin.math.max +class ExperimentParameters(parser: ArgParser) { + val traceDirectory by parser.storing("path to the trace directory") + val environmentFile by parser.storing("path to the environment file") + val outputFile by parser.storing("path to where the output should be stored") + .default { "sc20-experiment-results.csv" } + val selectedVms by parser.storing("the VMs to run") { + val vms: List<String> = jacksonObjectMapper().readValue(this) + vms + } + .default { + emptyList() + } +} + /** * Main entry point of the experiment. */ fun main(args: Array<String>) { - if (args.size < 2) { - println("error: Please provide path to directory containing VM trace files and the path to the environment file") - return - } - - val hypervisorMonitor = Sc20HypervisorMonitor() - val monitor = object : ServerMonitor { - override suspend fun onUpdate(server: Server, previousState: ServerState) { - println(server) + ArgParser(args).parseInto(::ExperimentParameters).run { + val hypervisorMonitor = Sc20HypervisorMonitor(outputFile) + val monitor = object : ServerMonitor { + override suspend fun onUpdate(server: Server, previousState: ServerState) { + println(server) + } } - } - val provider = ServiceLoader.load(SimulationEngineProvider::class.java).first() - val system = provider("test") - val root = system.newDomain("root") + val provider = ServiceLoader.load(SimulationEngineProvider::class.java).first() + val system = provider("test") + val root = system.newDomain("root") + + root.launch { + val environment = Sc20ClusterEnvironmentReader(File(environmentFile)) + .use { it.construct(root) } - root.launch { - val environment = Sc20ClusterEnvironmentReader(File(args[1])) - .use { it.construct(root) } + val performanceInterferenceModel = Sc20PerformanceInterferenceReader( + object {}.javaClass.getResourceAsStream("/env/performance-interference.json") + ).construct() - val performanceInterferenceModel = Sc20PerformanceInterferenceReader( - object {}.javaClass.getResourceAsStream("/env/performance-interference.json") - ).construct() + println(simulationContext.clock.instant()) - println(simulationContext.clock.instant()) + val scheduler = SimpleVirtProvisioningService( + AvailableMemoryAllocationPolicy(), + simulationContext, + environment.platforms[0].zones[0].services[ProvisioningService.Key], + hypervisorMonitor + ) - val scheduler = SimpleVirtProvisioningService( - AvailableMemoryAllocationPolicy(), - simulationContext, - environment.platforms[0].zones[0].services[ProvisioningService.Key], - hypervisorMonitor - ) + val reader = Sc20TraceReader(File(traceDirectory), performanceInterferenceModel, selectedVms) + while (reader.hasNext()) { + val (time, workload) = reader.next() + delay(max(0, time * 1000 - simulationContext.clock.millis())) + scheduler.deploy(workload.image, monitor, Flavor(workload.image.cores, workload.image.requiredMemory)) + } - val reader = Sc20TraceReader(File(args[0]), performanceInterferenceModel) -// delay(1376314846 * 1000L) - while (reader.hasNext()) { - val (time, workload) = reader.next() - delay(max(0, time * 1000 - simulationContext.clock.millis())) - scheduler.deploy(workload.image, monitor, Flavor(workload.image.cores, workload.image.requiredMemory)) + println(simulationContext.clock.instant()) } - println(simulationContext.clock.instant()) - } + runBlocking { + system.run() + system.terminate() + } - runBlocking { - system.run() - system.terminate() + // Explicitly close the monitor to flush its buffer + hypervisorMonitor.close() } - - // Explicitly close the monitor to flush its buffer - hypervisorMonitor.close() } diff --git a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt index d4656823..70f56165 100644 --- a/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt +++ b/opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt @@ -45,7 +45,8 @@ import java.util.UUID */ class Sc20TraceReader( traceDirectory: File, - performanceInterferenceModel: PerformanceInterferenceModel + performanceInterferenceModel: PerformanceInterferenceModel, + selectedVms: List<String> ) : TraceReader<VmWorkload> { /** * The internal iterator to use for this reader. @@ -65,9 +66,18 @@ class Sc20TraceReader( val provisionedMemoryCol = 20 val traceInterval = 5 * 60 * 1000L - traceDirectory.walk() - .filterNot { it.isDirectory } - .filter { it.extension == "csv" || it.extension == "txt" } + val vms = if (selectedVms.isEmpty()) { + traceDirectory.walk() + .filterNot { it.isDirectory } + .filter { it.extension == "csv" || it.extension == "txt" } + .toList() + } else { + selectedVms.map { + File(traceDirectory, it) + } + } + + vms .forEach { vmFile -> println(vmFile) val flopsHistory = mutableListOf<FlopsHistoryFragment>() |
