diff options
7 files changed, 49 insertions, 27 deletions
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json index 32fb870150e..4e50d31d74a 100644 --- a/config-provisioning/abi-spec.json +++ b/config-provisioning/abi-spec.json @@ -617,6 +617,7 @@ "public com.yahoo.config.provision.NodeResources withDiskGb(double)", "public com.yahoo.config.provision.NodeResources withBandwidthGbps(double)", "public com.yahoo.config.provision.NodeResources withDiskSpeed(com.yahoo.config.provision.NodeResources$DiskSpeed)", + "public com.yahoo.config.provision.NodeResources anySpeed()", "public com.yahoo.config.provision.NodeResources subtract(com.yahoo.config.provision.NodeResources)", "public com.yahoo.config.provision.NodeResources add(com.yahoo.config.provision.NodeResources)", "public boolean equals(java.lang.Object)", diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java index 5687697aff9..66baecf6c82 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java @@ -88,6 +88,11 @@ public class NodeResources { return new NodeResources(vcpu, memoryGb, diskGb, bandwidthGbps, speed); } + /** A shorthand for withDiskSpeed(NodeResources.DiskSpeed.any) */ + public NodeResources anySpeed() { + return withDiskSpeed(NodeResources.DiskSpeed.any); + } + public NodeResources subtract(NodeResources other) { if ( ! this.isInterchangeableWith(other)) throw new IllegalArgumentException(this + " and " + other + " are not interchangeable"); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java index fa439e50fbd..3d502d2b3da 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java @@ -16,6 +16,7 @@ import com.yahoo.vespa.hosted.provision.node.Reports; import com.yahoo.vespa.hosted.provision.node.Status; import java.time.Instant; +import java.util.Arrays; import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -332,6 +333,19 @@ public final class Node { } } + /** Computes the allocation skew of a host node */ + public static double skew(NodeResources totalHostCapacity, NodeResources freeHostCapacity) { + NodeResources all = totalHostCapacity.anySpeed(); + NodeResources allocated = all.subtract(freeHostCapacity.anySpeed()); + + return new Mean(allocated.vcpu() / all.vcpu(), + allocated.memoryGb() / all.memoryGb(), + allocated.diskGb() / all.diskGb()) + .deviation(); + } + + + @Override public boolean equals(Object o) { if (this == o) return true; @@ -389,4 +403,19 @@ public final class Node { } } + /** The mean and mean deviation (squared difference) of a bunch of numbers */ + private static class Mean { + + private final double mean; + private final double deviation; + + private Mean(double ... numbers) { + mean = Arrays.stream(numbers).sum() / numbers.length; + deviation = Arrays.stream(numbers).map(n -> Math.pow(mean - n, 2)).sum() / numbers.length; + } + + public double deviation() { return deviation; } + + } + } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java new file mode 100644 index 00000000000..d2158dd08db --- /dev/null +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java @@ -0,0 +1,5 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.provision.maintenance; + +public class Rebalancer { +} diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java index 4eea36c342a..112f118705b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java @@ -26,6 +26,12 @@ public class DockerHostCapacity { this.hostResourcesCalculator = Objects.requireNonNull(hostResourcesCalculator, "hostResourcesCalculator must be non-null"); } + /** Returns the allocation skew of this host */ + public double skew(Node host) { + NodeResources free = freeCapacityOf(host, false); + return Node.skew(host.flavor().resources(), free); + } + int compareWithoutInactive(Node hostA, Node hostB) { int result = compare(freeCapacityOf(hostB, true), freeCapacityOf(hostA, true)); if (result != 0) return result; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java index 50aeb464e9f..c5808a53837 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java @@ -10,4 +10,5 @@ public interface HostResourcesCalculator { /** Calculates the resources that are reserved for host level processes and returns the remainder. */ NodeResources availableCapacityOf(NodeResources hostResources); + } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java index d53e36b7501..d6ac5eb2c57 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java @@ -117,18 +117,8 @@ class PrioritizableNode implements Comparable<PrioritizableNode> { private double skewWith(NodeResources resources) { if (parent.isEmpty()) return 0; - NodeResources all = anySpeed(parent.get().flavor().resources()); - NodeResources allocated = all.subtract(anySpeed(freeParentCapacity)).add(anySpeed(resources)); - - return new Mean(allocated.vcpu() / all.vcpu(), - allocated.memoryGb() / all.memoryGb(), - allocated.diskGb() / all.diskGb()) - .deviation(); - } - - /** We don't care about disk speed in calculations here */ - private NodeResources anySpeed(NodeResources resources) { - return resources.withDiskSpeed(NodeResources.DiskSpeed.any); + NodeResources free = freeParentCapacity.anySpeed().subtract(resources.anySpeed()); + return Node.skew(parent.get().flavor().resources(), free); } private boolean isInNodeRepoAndReserved() { @@ -186,19 +176,4 @@ class PrioritizableNode implements Comparable<PrioritizableNode> { } } - /** The mean and mean deviation (squared difference) of a bunch of numbers */ - private static class Mean { - - private final double mean; - private final double deviation; - - private Mean(double ... numbers) { - mean = Arrays.stream(numbers).sum() / numbers.length; - deviation = Arrays.stream(numbers).map(n -> Math.pow(mean - n, 2)).sum() / numbers.length; - } - - public double deviation() { return deviation; } - - } - } |