diff options
author | Jon Bratseth <bratseth@gmail.com> | 2020-09-08 10:07:34 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2020-09-08 10:07:34 +0200 |
commit | 8891a7d5574ee34c3f7663c964171ad15a8003ac (patch) | |
tree | a187704d85a6b211038af5dbdd97b7ca29c1b3a5 /node-repository | |
parent | 5ca05d0121e19c67b7790206bb6b6968eaa232b2 (diff) |
Cluster size independent autoscaling reaction time
This makes the window considered about 1 hour regardless of cluster size.
Diffstat (limited to 'node-repository')
3 files changed, 5 insertions, 13 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 a02043aea78..e99eb88ff27 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,15 +20,7 @@ import java.util.stream.Collectors; */ public class Autoscaler { - /* - TODO: - - Scale group size - - Consider taking spikes/variance into account - - Measure observed regulation lag (startup+redistribution) and take it into account when deciding regulation observation window - - Scale by performance not just load+cost - */ - - private static final int minimumMeasurements = 500; // TODO: Per node instead? Also say something about interval? + private static final int minimumMeasurementsPerNode = 60; // 1 hour /** What cost difference factor is worth a reallocation? */ private static final double costDifferenceWorthReallocation = 0.1; @@ -113,8 +105,9 @@ public class Autoscaler { resource, clusterNodes.stream().map(Node::hostname).collect(Collectors.toList())); - if (window.measurementCount() < minimumMeasurements) return Optional.empty(); - if (window.hostnames() != clusterNodes.size()) return Optional.empty(); // Regulate only when all nodes are measured + // Require a total number of measurements scaling with the number of nodes but don't require them from all nodes + if (window.measurementCount()/clusterNodes.size() < minimumMeasurementsPerNode) return Optional.empty(); + if (window.hostnames() != clusterNodes.size()) return Optional.empty(); return Optional.of(window.average()); } 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 75bc73df5b0..7fa81f0b78e 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 @@ -22,7 +22,6 @@ import java.util.stream.Collectors; */ public class NodeMetricsDb { - private Logger log = Logger.getLogger(NodeMetricsDb.class.getName()); private static final Duration dbWindow = Duration.ofHours(24); /** Measurements by key. Each list of measurements is sorted by increasing timestamp */ diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java index a0a44e4f342..2bcbac828b8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java @@ -46,7 +46,7 @@ public class AutoscalingTest { assertTrue("No measurements -> No change", tester.autoscale(application1, cluster1.id(), min, max).isEmpty()); - tester.addMeasurements(Resource.cpu, 0.25f, 1f, 60, application1); + tester.addMeasurements(Resource.cpu, 0.25f, 1f, 59, application1); assertTrue("Too few measurements -> No change", tester.autoscale(application1, cluster1.id(), min, max).isEmpty()); tester.addMeasurements(Resource.cpu, 0.25f, 1f, 60, application1); |