From b3e8e3d196de8b8c1bb904bfb3c6641415cf72bb Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Tue, 17 Mar 2020 15:52:10 +0100 Subject: feat: Use Weilbull distribution for failures --- .../virt/service/SimpleVirtProvisioningService.kt | 1 - .../opendc/core/failure/UncorrelatedFaultInjector.kt | 19 ++++++++++++++----- .../atlarge/opendc/experiments/sc20/Sc20Monitor.kt | 3 ++- .../atlarge/opendc/experiments/sc20/TestExperiment.kt | 4 ++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/SimpleVirtProvisioningService.kt b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/SimpleVirtProvisioningService.kt index 9fad2396..0f38eca1 100644 --- a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/SimpleVirtProvisioningService.kt +++ b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/SimpleVirtProvisioningService.kt @@ -96,7 +96,6 @@ class SimpleVirtProvisioningService( } catch (e: InsufficientMemoryOnServerException) { println("Unable to deploy image due to insufficient memory") } - } } diff --git a/opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/failure/UncorrelatedFaultInjector.kt b/opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/failure/UncorrelatedFaultInjector.kt index 5155a25a..56706824 100644 --- a/opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/failure/UncorrelatedFaultInjector.kt +++ b/opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/failure/UncorrelatedFaultInjector.kt @@ -24,26 +24,35 @@ package com.atlarge.opendc.core.failure +import com.atlarge.odcsim.simulationContext import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import kotlin.math.ln +import kotlin.math.ln1p +import kotlin.math.pow import kotlin.random.Random /** * A [FaultInjector] that injects uncorrelated faults into the system, meaning that failures of the subsystems are * independent. */ -public class UncorrelatedFaultInjector(private val mu: Double = 1024.0, private val random: Random = Random.Default) : FaultInjector { +public class UncorrelatedFaultInjector(private val alpha: Double, private val beta: Double, private val random: Random = Random) : FaultInjector { /** * Enqueue the specified [FailureDomain] to fail some time in the future. */ override fun enqueue(domain: FailureDomain) { domain.scope.launch { - val d = random.expovariate(mu) - delay(d) + val d = random.weibull(alpha, beta) * 1e3 // Make sure to convert delay to milliseconds + + // Handle long overflow + if (simulationContext.clock.millis() + d <= 0) { + return@launch + } + + delay(d.toLong()) domain.fail() } } - private fun Random.expovariate(mu: Double) = (-mu * ln(1 - nextDouble())).toLong() + // XXX We should extract this in some common package later on. + private fun Random.weibull(alpha: Double, beta: Double) = (beta * (-ln1p(-nextDouble())).pow(1.0 / alpha)) } diff --git a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt index d3b2d5c6..40cb9719 100644 --- a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt +++ b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt @@ -18,10 +18,11 @@ class Sc20Monitor( private var failed: Int = 0 init { - outputFile.write("time,requestedBurst,grantedBurst,numberOfDeployedImages,server,hostUsage,powerDraw\n") + outputFile.write("time,requestedBurst,grantedBurst,numberOfDeployedImages,server,hostUsage,powerDraw,failedVms\n") } override suspend fun onUpdate(server: Server, previousState: ServerState) { + println("${simulationContext.clock.instant()} ${server.uid} ${server.state}") if (server.state == ServerState.ERROR) { failed++ } 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 a1619fe2..69174f0f 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 @@ -89,7 +89,6 @@ fun main(args: Array) { val provider = ServiceLoader.load(SimulationEngineProvider::class.java).first() val system = provider("test") val root = system.newDomain("root") - val chan = Channel(Channel.CONFLATED) root.launch { @@ -118,7 +117,8 @@ fun main(args: Array) { root.launch { chan.receive() - val faultInjector = UncorrelatedFaultInjector(mu = 2e7) + // Parameters from A. Iosup, A Framework for the Study of Grid Inter-Operation Mechanisms, 2009 + val faultInjector = UncorrelatedFaultInjector(alpha = 9.66772, beta = 12.23796) for (node in bareMetalProvisioner.nodes()) { faultInjector.enqueue(node.metadata["driver"] as FailureDomain) } -- cgit v1.2.3