diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-03-24 11:06:17 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-03-24 11:06:17 +0100 |
commit | 05ba0b8d7d76727fcefbd5b670b187081fe5d0f2 (patch) | |
tree | 7f30e874280f4aa5a97121e5a1da32132a1e8b14 /node-repository | |
parent | 5952a324edca0939fbab3ea9939e16ef509fd40f (diff) |
Refactor
Diffstat (limited to 'node-repository')
6 files changed, 31 insertions, 53 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java index a06ad89e299..79b09348d21 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java @@ -96,18 +96,18 @@ public class AllocationOptimizer { // Memory and disk: Scales with group size // The fixed cost portion of cpu does not scale with changes to the node count - double queryCpuPerGroup = fixedCpuCostFraction * target.nodeCpu() + - (1 - fixedCpuCostFraction) * target.nodeCpu() * current.groupSize() / groupSize; + double queryCpuPerGroup = fixedCpuCostFraction * target.resources().vcpu() + + (1 - fixedCpuCostFraction) * target.resources().vcpu() * current.groupSize() / groupSize; double queryCpu = queryCpuPerGroup * current.groups() / groups; - double writeCpu = target.nodeCpu() * current.groupSize() / groupSize; + double writeCpu = target.resources().vcpu() * current.groupSize() / groupSize; cpu = clusterModel.queryCpuFraction() * queryCpu + (1 - clusterModel.queryCpuFraction()) * writeCpu; - memory = target.nodeMemory() * current.groupSize() / groupSize; - disk = target.nodeDisk() * current.groupSize() / groupSize; + memory = target.resources().memoryGb() * current.groupSize() / groupSize; + disk = target.resources().diskGb() * current.groupSize() / groupSize; } else { - cpu = target.nodeCpu() * current.nodes() / nodes; - memory = target.nodeMemory(); - disk = target.nodeDisk(); + cpu = target.resources().vcpu() * current.nodes() / nodes; + memory = target.resources().memoryGb(); + disk = target.resources().diskGb(); } // Combine the scaled resource values computed here 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 de5d1805a2e..e3622c8f076 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 @@ -98,13 +98,8 @@ public class ClusterModel { public Load averageLoad() { return nodeTimeseries().averageLoad(); } - public double idealLoad(Resource resource) { - switch (resource) { - case cpu : return idealCpuLoad(); - case memory : return idealMemoryLoad; - case disk : return idealDiskLoad; - default : throw new IllegalStateException("No ideal load defined for " + resource); - } + public Load idealLoad() { + return new Load(idealCpuLoad(), idealMemoryLoad, idealDiskLoad); } /** Ideal cpu load must take the application traffic fraction into account */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Load.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Load.java index ce7aa2d8e66..21226fc7860 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Load.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Load.java @@ -34,6 +34,10 @@ public class Load { return new Load(divide(cpu, resources.vcpu()), divide(memory, resources.memoryGb()), divide(disk, resources.diskGb())); } + public Load divide(Load divisor) { + return new Load(divide(cpu, divisor.cpu()), divide(memory, divisor.memory()), divide(disk, divisor.disk())); + } + public Load divide(double divisor) { return new Load(divide(cpu, divisor), divide(memory, divisor), divide(disk, divisor)); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java index e2b35c0ecfa..3b8b7f08684 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java @@ -1,6 +1,7 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.autoscale; +import com.yahoo.config.provision.NodeResources; import com.yahoo.vespa.hosted.provision.applications.Application; import java.time.Clock; @@ -18,56 +19,34 @@ public class ResourceTarget { private final boolean adjustForRedundancy; /** The target real resources per node, assuming the node assignment where this was decided */ - private final double cpu, memory, disk; + private final NodeResources resources; - private ResourceTarget(double cpu, double memory, double disk, boolean adjustForRedundancy) { - this.cpu = cpu; - this.memory = memory; - this.disk = disk; + private ResourceTarget(NodeResources resources, boolean adjustForRedundancy) { + this.resources = resources; this.adjustForRedundancy = adjustForRedundancy; } /** Are the target resources given by this including redundancy or not */ public boolean adjustForRedundancy() { return adjustForRedundancy; } - /** Returns the target cpu per node, in terms of the current allocation */ - public double nodeCpu() { return cpu; } - - /** Returns the target memory per node, in terms of the current allocation */ - public double nodeMemory() { return memory; } - - /** Returns the target disk per node, in terms of the current allocation */ - public double nodeDisk() { return disk; } + /** Returns the target resources per node in terms of the current allocation */ + public NodeResources resources() { return resources; } @Override public String toString() { - return "target " + - (adjustForRedundancy ? "(with redundancy adjustment) " : "") + - "[vcpu " + cpu + ", memoryGb " + memory + ", diskGb " + disk + "]"; - } - - private static double nodeUsage(Resource resource, double load, AllocatableClusterResources current) { - return load * resource.valueFrom(current.realResources().nodeResources()); + return "target " + resources + (adjustForRedundancy ? "(with redundancy adjustment) " : ""); } /** Create a target of achieving ideal load given a current load */ public static ResourceTarget idealLoad(ClusterModel clusterModel, AllocatableClusterResources current) { - return new ResourceTarget(nodeUsage(Resource.cpu, clusterModel.averageLoad().cpu(), current) - / clusterModel.idealLoad(Resource.cpu), - nodeUsage(Resource.memory, clusterModel.averageLoad().memory(), current) - / clusterModel.idealLoad(Resource.memory), - nodeUsage(Resource.disk, clusterModel.averageLoad().disk(), current) - / clusterModel.idealLoad(Resource.disk), - true); + var loadAdjustment = clusterModel.averageLoad().divide(clusterModel.idealLoad()); + return new ResourceTarget(loadAdjustment.scaled(current.realResources().nodeResources()), true); } /** Crete a target of preserving a current allocation */ public static ResourceTarget preserve(AllocatableClusterResources current) { - return new ResourceTarget(current.realResources().nodeResources().vcpu(), - current.realResources().nodeResources().memoryGb(), - current.realResources().nodeResources().diskGb(), - false); + return new ResourceTarget(current.realResources().nodeResources(), false); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java index d6ad5c654e2..7b42304d7be 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java @@ -95,11 +95,11 @@ public class ApplicationSerializer { private static void clusterUtilizationToSlime(ClusterModel clusterModel, Cursor utilizationObject) { utilizationObject.setDouble("cpu", clusterModel.averageLoad().cpu()); - utilizationObject.setDouble("idealCpu", clusterModel.idealLoad(Resource.cpu)); + utilizationObject.setDouble("idealCpu", clusterModel.idealLoad().cpu()); utilizationObject.setDouble("memory", clusterModel.averageLoad().memory()); - utilizationObject.setDouble("idealMemory", clusterModel.idealLoad(Resource.memory)); + utilizationObject.setDouble("idealMemory", clusterModel.idealLoad().memory()); utilizationObject.setDouble("disk", clusterModel.averageLoad().disk()); - utilizationObject.setDouble("idealDisk", clusterModel.idealLoad(Resource.disk)); + utilizationObject.setDouble("idealDisk", clusterModel.idealLoad().disk()); } private static void scalingEventsToSlime(List<ScalingEvent> scalingEvents, Cursor scalingEventsArray) { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java index 70550b0a7c3..4d9fd6224b1 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java @@ -37,13 +37,13 @@ public class ClusterModelTest { var model1 = new ClusterModel(application.with(new Status(0.0, 1.0)), cluster, clock, Duration.ofMinutes(10), timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock)); - assertEquals(0.131, model1.idealLoad(Resource.cpu), delta); + assertEquals(0.131, model1.idealLoad().cpu(), delta); // Almost no current traffic share: Ideal load is low but capped var model2 = new ClusterModel(application.with(new Status(0.0001, 1.0)), cluster, clock, Duration.ofMinutes(10), timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock)); - assertEquals(0.131, model2.idealLoad(Resource.cpu), delta); + assertEquals(0.131, model2.idealLoad().cpu(), delta); } @Test @@ -58,13 +58,13 @@ public class ClusterModelTest { var model1 = new ClusterModel(application, cluster, clock, Duration.ofMinutes(10), timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0, t -> 0.0, clock)); - assertEquals(0.275, model1.idealLoad(Resource.cpu), delta); + assertEquals(0.275, model1.idealLoad().cpu(), delta); // Almost current traffic: Ideal load is low but capped var model2 = new ClusterModel(application.with(new Status(0.0001, 1.0)), cluster, clock, Duration.ofMinutes(10), timeseries(cluster,100, t -> t == 0 ? 10000.0 : 0.0001, t -> 0.0, clock)); - assertEquals(0.275, model1.idealLoad(Resource.cpu), delta); + assertEquals(0.275, model1.idealLoad().cpu(), delta); } private Cluster cluster(NodeResources resources) { |