From ca62489dd4fe4bee6b6a04b830b3fe48693c3c81 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 16 Sep 2020 13:07:48 +0200 Subject: Require fewer measurements to scale containers --- .../yahoo/vespa/hosted/provision/autoscale/Autoscaler.java | 12 ++++++++---- .../vespa/hosted/provision/autoscale/NodeMetricsDb.java | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'node-repository') diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java index 1ba03a7c9bc..ba63376d61e 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java @@ -20,8 +20,6 @@ import java.util.stream.Collectors; */ public class Autoscaler { - private static final int minimumMeasurementsPerNode = 60; // 1 hour - /** What cost difference factor is worth a reallocation? */ private static final double costDifferenceWorthReallocation = 0.1; /** What difference factor for a resource is worth a reallocation? */ @@ -106,18 +104,24 @@ public class Autoscaler { // Require a total number of measurements scaling with the number of nodes, // but don't require that we have at least that many from every node - if (window.measurementCount()/clusterNodes.size() < minimumMeasurementsPerNode) return Optional.empty(); + if (window.measurementCount()/clusterNodes.size() < minimumMeasurementsPerNode(clusterType)) return Optional.empty(); if (window.hostnames() != clusterNodes.size()) return Optional.empty(); return Optional.of(window.average()); } - /** The duration of the window we need to consider to make a scaling decision */ + /** The duration of the window we need to consider to make a scaling decision. See also minimumMeasurementsPerNode */ static Duration scalingWindow(ClusterSpec.Type clusterType) { if (clusterType.isContent()) return Duration.ofHours(12); return Duration.ofHours(1); } + /** Measurements are currently taken once a minute. See also scalingWindow */ + static int minimumMeasurementsPerNode(ClusterSpec.Type clusterType) { + if (clusterType.isContent()) return 60; + return 20; + } + public static boolean unstable(List nodes) { return nodes.stream().anyMatch(node -> node.status().wantToRetire() || node.allocation().get().membership().retired() || diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDb.java index 48bcd435806..316708732a7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDb.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDb.java @@ -63,7 +63,7 @@ public class NodeMetricsDb { public void gc(Clock clock) { synchronized (lock) { // Each measurement is Object + long + float = 16 + 8 + 4 = 28 bytes - // 24 hours with 1k nodes and 3 resources and 1 measurement/sec is about 10Gb + // 12 hours with 1k nodes and 3 resources and 1 measurement/sec is about 5Gb for (Iterator i = db.values().iterator(); i.hasNext(); ) { var measurements = i.next(); -- cgit v1.2.3