summaryrefslogtreecommitdiff
path: root/opendc
diff options
context:
space:
mode:
authorGeorgios Andreadis <info@gandreadis.com>2020-03-11 16:11:43 +0100
committerGeorgios Andreadis <info@gandreadis.com>2020-03-11 16:11:43 +0100
commit224faa406b136e42b0406ab55425d382acc54fee (patch)
tree1f23f1970cfde81b80e925ce42dfb7fad5ddb96b /opendc
parent0655127dcd945289f045d8e04304e6a050e2a2f9 (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')
-rw-r--r--opendc/opendc-experiments-sc20/build.gradle.kts2
-rw-r--r--opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20HypervisorMonitor.kt6
-rw-r--r--opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt94
-rw-r--r--opendc/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/sc20/Sc20TraceReader.kt18
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>()