diff options
4 files changed, 15 insertions, 19 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 ac1077a42ae..4fb91e8592e 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 @@ -18,6 +18,11 @@ import java.util.OptionalDouble; */ public class ClusterModel { + static final double idealQueryCpuLoad = 0.8; + static final double idealWriteCpuLoad = 0.95; + static final double idealMemoryLoad = 0.7; + static final double idealDiskLoad = 0.6; + private final Application application; private final Cluster cluster; private final NodeList nodes; @@ -93,7 +98,9 @@ public class ClusterModel { public double idealLoad(Resource resource) { switch (resource) { case cpu : return idealCpuLoad(); - default : return resource.idealAverageLoad(); // TODO: Move here + case memory : return idealMemoryLoad; + case disk : return idealDiskLoad; + default : throw new IllegalStateException("No ideal load defined for " + resource); } } @@ -121,8 +128,8 @@ public class ClusterModel { // Assumptions: 1) Write load is not organic so we should not grow to handle more. // (TODO: But allow applications to set their target write rate and size for that) // 2) Write load does not change in BCP scenarios. - return queryCpuFraction * 1 / growthRateHeadroom * 1 / trafficShiftHeadroom * idealQueryCpuLoad() + - (1 - queryCpuFraction) * idealWriteCpuLoad(); + return queryCpuFraction * 1 / growthRateHeadroom * 1 / trafficShiftHeadroom * idealQueryCpuLoad + + (1 - queryCpuFraction) * idealWriteCpuLoad; } private double queryCpuFraction() { @@ -138,10 +145,6 @@ public class ClusterModel { return queryFraction * relativeQueryCost / (queryFraction * relativeQueryCost + writeFraction); } - public static double idealQueryCpuLoad() { return Resource.cpu.idealAverageLoad(); } - - public static double idealWriteCpuLoad() { return 0.95; } - private static Duration computeScalingDuration(Cluster cluster, NodeList nodes) { int completedEventCount = 0; Duration totalDuration = Duration.ZERO; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Resource.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Resource.java index b841b31833f..c639ad1f779 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Resource.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Resource.java @@ -12,25 +12,19 @@ public enum Resource { /** Cpu utilization ratio */ cpu { - public double idealAverageLoad() { return 0.8; } double valueFrom(NodeResources resources) { return resources.vcpu(); } }, /** Memory utilization ratio */ memory { - public double idealAverageLoad() { return 0.7; } double valueFrom(NodeResources resources) { return resources.memoryGb(); } }, /** Disk utilization ratio */ disk { - public double idealAverageLoad() { return 0.6; } double valueFrom(NodeResources resources) { return resources.diskGb(); } }; - /** The load we should have of this resource on average, when one node in the cluster is down */ - public abstract double idealAverageLoad(); - abstract double valueFrom(NodeResources resources); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java index cc3eeb47073..89da20c5550 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java @@ -141,8 +141,8 @@ class AutoscalingTester { clock().advance(Duration.ofMinutes(5)); for (Node node : nodes) { float cpu = value * oneExtraNodeFactor; - float memory = (float) Resource.memory.idealAverageLoad() * otherResourcesLoad * oneExtraNodeFactor; - float disk = (float) Resource.disk.idealAverageLoad() * otherResourcesLoad * oneExtraNodeFactor; + float memory = (float) ClusterModel.idealMemoryLoad * otherResourcesLoad * oneExtraNodeFactor; + float disk = (float) ClusterModel.idealDiskLoad * otherResourcesLoad * oneExtraNodeFactor; db.addNodeMetrics(List.of(new Pair<>(node.hostname(), new NodeMetricSnapshot(clock().instant(), cpu, memory, @@ -174,7 +174,7 @@ class AutoscalingTester { for (Node node : nodes) { float cpu = (float) 0.2 * otherResourcesLoad * oneExtraNodeFactor; float memory = value * oneExtraNodeFactor; - float disk = (float) Resource.disk.idealAverageLoad() * otherResourcesLoad * oneExtraNodeFactor; + float disk = (float) ClusterModel.idealDiskLoad * otherResourcesLoad * oneExtraNodeFactor; db.addNodeMetrics(List.of(new Pair<>(node.hostname(), new NodeMetricSnapshot(clock().instant(), cpu, memory, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java index 9ae67cef235..10851252c98 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java @@ -17,6 +17,7 @@ import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.applications.Cluster; +import com.yahoo.vespa.hosted.provision.autoscale.ClusterModel; import com.yahoo.vespa.hosted.provision.autoscale.NodeMetricSnapshot; import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import com.yahoo.vespa.hosted.provision.autoscale.Resource; @@ -99,9 +100,7 @@ public class ScalingSuggestionsMaintainerTest { var suggested = tester.nodeRepository().applications().get(app1).get().cluster(cluster1.id()).get().suggestedResources().get().resources(); tester.deploy(app1, cluster1, Capacity.from(suggested, suggested, false, true)); tester.clock().advance(Duration.ofDays(2)); - addMeasurements(0.2f, - (float)Resource.memory.idealAverageLoad(), - (float)Resource.disk.idealAverageLoad(), + addMeasurements(0.2f, 0.7f, 0.6f, 0, 500, app1, tester.nodeRepository(), metricsDb); maintainer.maintain(); assertEquals("Suggestion is to keep the current allocation", |