Skip to content

Commit

Permalink
Added Fragment scaling (#296)
Browse files Browse the repository at this point in the history
* Added maxCpuDemand to TraceWorkload, don't know if this will be needed so might remove later.

Updated SimTraceWorkload to properly handle creating checkpoints

Fixed a bug with the updatedConsumers in the FlowDistributor

Implemented a first version of scaling the runtime of fragments.

* small update

* updated tests to reflect the changes in the checkpointing model

* Updated the checkpointing tests to reflect the changes made

* updated wrapper-validation-action

* Applied spotless
  • Loading branch information
DanteNiewenhuis authored Jan 24, 2025
1 parent bb945c2 commit be96984
Show file tree
Hide file tree
Showing 26 changed files with 810 additions and 163 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action@v1
uses: gradle/wrapper-validation-action@v3
- name: Set up JDK
uses: actions/setup-java@v4
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action@v1
uses: gradle/wrapper-validation-action@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action@v1
uses: gradle/wrapper-validation-action@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ import org.opendc.compute.simulator.telemetry.GuestSystemStats
import org.opendc.simulator.compute.machine.SimMachine
import org.opendc.simulator.compute.machine.VirtualMachine
import org.opendc.simulator.compute.workload.ChainWorkload
import org.opendc.simulator.compute.workload.TraceFragment
import org.opendc.simulator.compute.workload.TraceWorkload
import org.opendc.simulator.compute.workload.trace.TraceFragment
import org.opendc.simulator.compute.workload.trace.TraceWorkload
import org.opendc.simulator.compute.workload.trace.scaling.NoDelayScaling
import java.time.Duration
import java.time.Instant
import java.time.InstantSource
Expand Down Expand Up @@ -93,6 +94,8 @@ public class Guest(

onStart()

val scalingPolicy = NoDelayScaling()

val bootworkload =
TraceWorkload(
ArrayList(
Expand All @@ -107,6 +110,7 @@ public class Guest(
0,
0,
0.0,
scalingPolicy,
)

if (task.workload is TraceWorkload) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
package org.opendc.compute.workload

import mu.KotlinLogging
import org.opendc.simulator.compute.workload.TraceWorkload
import org.opendc.simulator.compute.workload.trace.TraceWorkload
import org.opendc.simulator.compute.workload.trace.scaling.NoDelayScaling
import org.opendc.simulator.compute.workload.trace.scaling.ScalingPolicy
import org.opendc.trace.Trace
import org.opendc.trace.conv.TABLE_RESOURCES
import org.opendc.trace.conv.TABLE_RESOURCE_STATES
Expand Down Expand Up @@ -53,6 +55,7 @@ public class ComputeWorkloadLoader(
private val checkpointInterval: Long = 0L,
private val checkpointDuration: Long = 0L,
private val checkpointIntervalScaling: Double = 1.0,
private val scalingPolicy: ScalingPolicy = NoDelayScaling(),
) : WorkloadLoader(subMissionTime) {
/**
* The logger for this instance.
Expand Down Expand Up @@ -84,7 +87,10 @@ public class ComputeWorkloadLoader(
val cores = reader.getInt(coresCol)
val cpuUsage = reader.getDouble(usageCol)

val builder = fragments.computeIfAbsent(id) { Builder(checkpointInterval, checkpointDuration, checkpointIntervalScaling) }
val builder =
fragments.computeIfAbsent(
id,
) { Builder(checkpointInterval, checkpointDuration, checkpointIntervalScaling, scalingPolicy) }
builder.add(durationMs, cpuUsage, cores)
}

Expand Down Expand Up @@ -178,7 +184,12 @@ public class ComputeWorkloadLoader(
/**
* A builder for a VM trace.
*/
private class Builder(checkpointInterval: Long, checkpointDuration: Long, checkpointIntervalScaling: Double) {
private class Builder(
checkpointInterval: Long,
checkpointDuration: Long,
checkpointIntervalScaling: Double,
scalingPolicy: ScalingPolicy,
) {
/**
* The total load of the trace.
*/
Expand All @@ -187,7 +198,7 @@ public class ComputeWorkloadLoader(
/**
* The internal builder for the trace.
*/
private val builder = TraceWorkload.builder(checkpointInterval, checkpointDuration, checkpointIntervalScaling)
private val builder = TraceWorkload.builder(checkpointInterval, checkpointDuration, checkpointIntervalScaling, scalingPolicy)

/**
* Add a fragment to the trace.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

package org.opendc.compute.workload

import org.opendc.simulator.compute.workload.TraceWorkload
import org.opendc.simulator.compute.workload.trace.TraceWorkload
import java.time.Instant
import java.util.UUID

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ package org.opendc.experiments.base.experiment.specs
import kotlinx.serialization.Serializable
import org.opendc.compute.workload.ComputeWorkloadLoader
import org.opendc.compute.workload.WorkloadLoader
import org.opendc.simulator.compute.workload.trace.scaling.NoDelayScaling
import org.opendc.simulator.compute.workload.trace.scaling.PerfectScaling
import org.opendc.simulator.compute.workload.trace.scaling.ScalingPolicy
import java.io.File

/**
Expand All @@ -41,6 +44,7 @@ public data class WorkloadSpec(
val type: WorkloadTypes,
val sampleFraction: Double = 1.0,
val submissionTime: String? = null,
val scalingPolicy: ScalingPolicyEnum = ScalingPolicyEnum.NoDelay,
) {
public val name: String = File(pathToFile).nameWithoutExtension

Expand All @@ -56,11 +60,6 @@ public data class WorkloadSpec(
* @constructor Create empty Workload types
*/
public enum class WorkloadTypes {
/**
* Compute workload
*
* @constructor Create empty Compute workload
*/
ComputeWorkload,
}

Expand All @@ -74,6 +73,7 @@ public fun getWorkloadLoader(
checkpointInterval: Long,
checkpointDuration: Long,
checkpointIntervalScaling: Double,
scalingPolicy: ScalingPolicy,
): WorkloadLoader {
return when (type) {
WorkloadTypes.ComputeWorkload ->
Expand All @@ -83,6 +83,19 @@ public fun getWorkloadLoader(
checkpointInterval,
checkpointDuration,
checkpointIntervalScaling,
scalingPolicy,
)
}
}

public enum class ScalingPolicyEnum {
NoDelay,
Perfect,
}

public fun getScalingPolicy(scalingPolicyEnum: ScalingPolicyEnum): ScalingPolicy {
return when (scalingPolicyEnum) {
ScalingPolicyEnum.NoDelay -> NoDelayScaling()
ScalingPolicyEnum.Perfect -> PerfectScaling()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import org.opendc.compute.simulator.service.ComputeService
import org.opendc.compute.simulator.telemetry.parquet.ParquetComputeMonitor
import org.opendc.compute.topology.clusterTopology
import org.opendc.experiments.base.experiment.Scenario
import org.opendc.experiments.base.experiment.specs.getScalingPolicy
import org.opendc.experiments.base.experiment.specs.getWorkloadLoader
import org.opendc.simulator.kotlin.runSimulation
import java.io.File
Expand Down Expand Up @@ -80,6 +81,8 @@ public fun runScenario(
val checkpointDuration = scenario.checkpointModelSpec?.checkpointDuration ?: 0L
val checkpointIntervalScaling = scenario.checkpointModelSpec?.checkpointIntervalScaling ?: 1.0

val scalingPolicy = getScalingPolicy(scenario.workloadSpec.scalingPolicy)

val workloadLoader =
getWorkloadLoader(
scenario.workloadSpec.type,
Expand All @@ -88,6 +91,7 @@ public fun runScenario(
checkpointInterval,
checkpointDuration,
checkpointIntervalScaling,
scalingPolicy,
)
val workload = workloadLoader.sampleByLoad(scenario.workloadSpec.sampleFraction)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertAll
import org.opendc.compute.workload.Task
import org.opendc.simulator.compute.workload.TraceFragment
import org.opendc.simulator.compute.workload.trace.TraceFragment
import java.util.ArrayList

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertAll
import org.opendc.compute.workload.Task
import org.opendc.simulator.compute.workload.TraceFragment
import org.opendc.simulator.compute.workload.trace.TraceFragment
import java.util.ArrayList

/**
Expand Down
Loading

0 comments on commit be96984

Please sign in to comment.