diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-12-07 16:14:11 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2022-12-07 16:14:11 +0100 |
commit | 74d610c0b4f7285b4aebc4528bc2d281738354ca (patch) | |
tree | f8118358ad120d7279db4a11e2355fe37aaa31bc /node-repository | |
parent | c82f99ab1aec0bdf6d098b2dfebc985b8b096eea (diff) |
Scale down slightly more aggressively
Don't require a minimum number of measurements as we might
not be able to ever collect them fast enough within the scaling window.
Diffstat (limited to 'node-repository')
3 files changed, 26 insertions, 2 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java index db5771cd623..6d3deae4f66 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java @@ -72,6 +72,7 @@ public class ClusterModel { this.scalingDuration = computeScalingDuration(cluster, clusterSpec); this.clusterTimeseries = metricsDb.getClusterTimeseries(application.id(), cluster.id()); this.nodeTimeseries = new ClusterNodesTimeseries(scalingDuration(), cluster, nodes, metricsDb); + System.out.println("Scaling duration: " + scalingDuration + ", measurements per node: " + nodeTimeseries.measurementsPerNode()); } ClusterModel(Zone zone, @@ -100,6 +101,7 @@ public class ClusterModel { /** Returns the relative load adjustment that should be made to this cluster given available measurements. */ public Load loadAdjustment() { + System.out.println("Node timeseries is empty: " + nodeTimeseries().isEmpty()); if (nodeTimeseries().isEmpty()) return Load.one(); Load adjustment = peakLoad().divide(idealLoad()); @@ -111,7 +113,6 @@ public class ClusterModel { /** Are we in a position to make decisions to scale down at this point? */ private boolean safeToScaleDown() { if (hasScaledIn(scalingDuration().multipliedBy(3))) return false; - if (nodeTimeseries().measurementsPerNode() < 4) return false; if (nodeTimeseries().nodesMeasured() != nodeCount()) return false; return true; } 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 ff72d22bb39..eda677c6e59 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 @@ -78,6 +78,25 @@ public class AutoscalingTest { } @Test + public void test_container_scaling_down_exclusive() { + var min = new ClusterResources(2, 1, new NodeResources(4, 8, 50, 0.1)); + var now = new ClusterResources(8, 1, new NodeResources(4, 8, 50, 0.1)); + var max = new ClusterResources(8, 1, new NodeResources(4, 8, 50, 0.1)); + var fixture = AutoscalingTester.fixture() + .awsProdSetup(false) + .clusterType(ClusterSpec.Type.container) + .initialResources(Optional.of(now)) + .capacity(Capacity.from(min, max)) + .build(); + fixture.tester().setScalingDuration(fixture.applicationId(), fixture.clusterSpec.id(), Duration.ofMinutes(5)); + + fixture.loader().applyLoad(new Load(0.01, 0.38, 0), 5); + fixture.tester().assertResources("Scaling down", + 2, 1, 4, 8, 50, + fixture.autoscale()); + } + + @Test public void initial_deployment_with_host_sharing_flag() { var min = new ClusterResources(7, 1, new NodeResources(2.0, 10.0, 384.0, 0.1)); var max = new ClusterResources(7, 1, new NodeResources(2.4, 32.0, 768.0, 0.1)); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java index 2d05754d96e..5ceb28d3fed 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java @@ -178,7 +178,11 @@ public class AutoscalingMaintainerTest { } assertEquals(Cluster.maxScalingEvents, tester.cluster(app1, cluster1).scalingEvents().size()); - assertEquals("The latest rescaling is the last event stored", + + // Complete last event + tester.addMeasurements(0.1f, 0.1f, 0.1f, 20, 1, app1); + tester.maintainer().maintain(); + assertEquals("Last event is completed", tester.clock().instant(), tester.cluster(app1, cluster1).scalingEvents().get(Cluster.maxScalingEvents - 1).completion().get()); } |