summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-09-16 13:07:48 +0200
committerJon Bratseth <bratseth@gmail.com>2020-09-16 13:07:48 +0200
commitca62489dd4fe4bee6b6a04b830b3fe48693c3c81 (patch)
tree8a6dced2ae103ae8be860710caf2de9c0f283634 /node-repository
parent89ab60aa22cb1bd223714650d42aac59d03dc95b (diff)
Require fewer measurements to scale containers
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDb.java2
2 files changed, 9 insertions, 5 deletions
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<Node> 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<NodeMeasurements> i = db.values().iterator(); i.hasNext(); ) {
var measurements = i.next();