aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-03-24 11:06:17 +0100
committerJon Bratseth <bratseth@gmail.com>2021-03-24 11:06:17 +0100
commit05ba0b8d7d76727fcefbd5b670b187081fe5d0f2 (patch)
tree7f30e874280f4aa5a97121e5a1da32132a1e8b14 /node-repository
parent5952a324edca0939fbab3ea9939e16ef509fd40f (diff)
Refactor
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java16
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java9
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Load.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ResourceTarget.java41
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModelTest.java8
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) {