summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2020-03-17 15:52:10 +0100
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-03-25 10:48:58 +0100
commitb3e8e3d196de8b8c1bb904bfb3c6641415cf72bb (patch)
tree4637fc7a7d95dfd239854457a88384c8d79341ba
parent43f1376a00342338f4d0affde5e1f2f540ab7e32 (diff)
feat: Use Weilbull distribution for failures
-rw-r--r--opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/SimpleVirtProvisioningService.kt1
-rw-r--r--opendc/opendc-core/src/main/kotlin/com/atlarge/opendc/core/failure/UncorrelatedFaultInjector.kt19
-rw-r--r--opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt3
-rw-r--r--opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt4
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<String>) {
val provider = ServiceLoader.load(SimulationEngineProvider::class.java).first()
val system = provider("test")
val root = system.newDomain("root")
-
val chan = Channel<Unit>(Channel.CONFLATED)
root.launch {
@@ -118,7 +117,8 @@ fun main(args: Array<String>) {
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)
}