From 24dd7d4c0004c3f6f76e3b9aef35fdcb8951c921 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 28 May 2020 13:52:16 +0200 Subject: Use average real resources --- .../provision/autoscale/AllocatableClusterResources.java | 13 ++++++++++++- .../provision/provisioning/NodeRepositoryProvisioner.java | 6 ++---- 2 files changed, 14 insertions(+), 5 deletions(-) (limited to 'node-repository') diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java index b5a5d1e06b4..84f0b962d34 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java @@ -44,7 +44,7 @@ public class AllocatableClusterResources { public AllocatableClusterResources(List nodes, NodeRepository nodeRepository) { this.nodes = nodes.size(); this.groups = (int)nodes.stream().map(node -> node.allocation().get().membership().cluster().group()).distinct().count(); - this.realResources = nodeRepository.resourcesCalculator().realResourcesOf(nodes.get(0), nodeRepository); + this.realResources = averageRealResourcesOf(nodes, nodeRepository); // Average since we average metrics over nodes this.advertisedResources = nodes.get(0).flavor().resources(); this.clusterType = nodes.get(0).allocation().get().membership().cluster().type(); this.fulfilment = 1; @@ -119,6 +119,17 @@ public class AllocatableClusterResources { (fulfilment < 1.0 ? " (fulfilment " + fulfilment + ")" : ""); } + private static NodeResources averageRealResourcesOf(List nodes, NodeRepository nodeRepository) { + NodeResources sum = new NodeResources(0, 0, 0, 0); + for (Node node : nodes) + sum = sum.add(nodeRepository.resourcesCalculator().realResourcesOf(node, nodeRepository).justNumbers()); + return nodes.get(0).flavor().resources().justNonNumbers() + .withVcpu(sum.vcpu() / nodes.size()) + .withMemoryGb(sum.memoryGb() / nodes.size()) + .withDiskGb(sum.diskGb() / nodes.size()) + .withBandwidthGbps(sum.bandwidthGbps() / nodes.size()); + } + /** * Returns the best matching allocatable node resources given ideal node resources, * or empty if none available within the limits. diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java index 433a69a063e..3ddfb646cf3 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java @@ -59,10 +59,6 @@ public class NodeRepositoryProvisioner implements Provisioner { private final Optional loadBalancerProvisioner; private final NodeResourceLimits nodeResourceLimits; - int getSpareCapacityProd() { - return SPARE_CAPACITY_PROD; - } - @Inject public NodeRepositoryProvisioner(NodeRepository nodeRepository, Zone zone, ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource) { @@ -137,6 +133,8 @@ public class NodeRepositoryProvisioner implements Provisioner { loadBalancerProvisioner.ifPresent(lbProvisioner -> lbProvisioner.deactivate(application, transaction)); } + int getSpareCapacityProd() { return SPARE_CAPACITY_PROD; } + /** * Returns the target cluster resources, a value between the min and max in the requested capacity, * and updates the application store with the received min and max. -- cgit v1.2.3