diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-01-15 13:06:06 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-01-15 13:06:06 +0100 |
commit | 09f534c252c3d9650d3baa962614680b78e46586 (patch) | |
tree | 2d5d6d9fc8cf3cdc57985e64e62c29a80b874821 /node-repository | |
parent | d49811c13c338f292846238ec3e3f0967364ad6a (diff) |
Allocate max half of hosts actually available in zone
Diffstat (limited to 'node-repository')
2 files changed, 11 insertions, 6 deletions
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 456c1fa9a2d..8f28e307c5d 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 @@ -6,11 +6,13 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeResources; 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.provisioning.NodeResourceLimits; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; /** * @author bratseth @@ -134,6 +136,7 @@ public class AllocatableClusterResources { public static Optional<AllocatableClusterResources> from(ClusterResources wantedResources, ClusterSpec clusterSpec, Limits applicationLimits, + NodeList hosts, NodeRepository nodeRepository) { var systemLimits = new NodeResourceLimits(nodeRepository); boolean exclusive = clusterSpec.isExclusive(); @@ -144,7 +147,7 @@ public class AllocatableClusterResources { advertisedResources = applicationLimits.cap(advertisedResources); // Overrides other conditions, even if it will then fail var realResources = nodeRepository.resourcesCalculator().requestToReal(advertisedResources, exclusive); // What we'll really get if ( ! systemLimits.isWithinRealLimits(realResources, clusterSpec.type())) return Optional.empty(); - if (matchesAny(nodeRepository.flavors().getFlavors(), advertisedResources)) + if (matchesAny(hosts, advertisedResources)) return Optional.of(new AllocatableClusterResources(wantedResources.with(realResources), advertisedResources, wantedResources.nodeResources(), @@ -183,12 +186,12 @@ public class AllocatableClusterResources { } } - /** Returns true if the given resources could be allocated on any of the given flavors */ - private static boolean matchesAny(List<Flavor> flavors, NodeResources advertisedResources) { + /** Returns true if the given resources could be allocated on any of the given host flavors */ + private static boolean matchesAny(NodeList hosts, NodeResources advertisedResources) { // Tenant nodes should not consume more than half the resources of the biggest hosts // to make it easier to shift them between hosts. - return flavors.stream().anyMatch(flavor -> flavor.resources().withVcpu(flavor.resources().vcpu() / 2) - .satisfies(advertisedResources)); + return hosts.stream().anyMatch(host -> host.resources().withVcpu(host.resources().vcpu() / 2) + .satisfies(advertisedResources)); } private static boolean between(NodeResources min, NodeResources max, NodeResources r) { 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 4e6d342fa49..1ec2b841790 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 @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.provision.autoscale; import com.yahoo.config.provision.ClusterResources; import com.yahoo.config.provision.NodeResources; +import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import java.util.Optional; @@ -43,6 +44,7 @@ public class AllocationOptimizer { limits = Limits.of(new ClusterResources(minimumNodes, 1, NodeResources.unspecified()), new ClusterResources(maximumNodes, maximumNodes, NodeResources.unspecified())); Optional<AllocatableClusterResources> bestAllocation = Optional.empty(); + NodeList hosts = nodeRepository.list().hosts(); for (int groups = limits.min().groups(); groups <= limits.max().groups(); groups++) { for (int nodes = limits.min().nodes(); nodes <= limits.max().nodes(); nodes++) { if (nodes % groups != 0) continue; @@ -57,7 +59,7 @@ public class AllocationOptimizer { groups, nodeResourcesWith(nodesAdjustedForRedundancy, groupsAdjustedForRedundancy, limits, current, target)); - var allocatableResources = AllocatableClusterResources.from(next, current.clusterSpec(), limits, nodeRepository); + var allocatableResources = AllocatableClusterResources.from(next, current.clusterSpec(), limits, hosts, nodeRepository); if (allocatableResources.isEmpty()) continue; if (bestAllocation.isEmpty() || allocatableResources.get().preferableTo(bestAllocation.get())) bestAllocation = allocatableResources; |