diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-03-24 10:02:29 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-03-24 10:02:29 +0100 |
commit | 444c3b28b18d168a6721b2a4bf46a0a7b27d2cf4 (patch) | |
tree | 94f7545b88fb3d3608732177ace422c4c1050e00 /node-repository | |
parent | 5dc0c39101d3ce578890c74ccd076243d36cf2a7 (diff) |
Refactor
Diffstat (limited to 'node-repository')
3 files changed, 34 insertions, 29 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepoStats.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepoStats.java index 42bd6a5ef1f..f135b395b3a 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepoStats.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepoStats.java @@ -58,7 +58,7 @@ public class NodeRepoStats { private static Pair<Load, Load> computeLoad(NodeList allNodes, List<NodeTimeseries> allNodeTimeseries) { NodeResources totalActiveResources = new NodeResources(0, 0, 0, 0); - double cpu = 0, memory = 0, disk = 0; + Load load = Load.zero(); for (var nodeTimeseries : allNodeTimeseries) { Optional<Node> node = allNodes.node(nodeTimeseries.hostname()); if (node.isEmpty() || node.get().state() != Node.State.active) continue; @@ -66,24 +66,15 @@ public class NodeRepoStats { Optional<NodeMetricSnapshot> snapshot = nodeTimeseries.last(); if (snapshot.isEmpty()) continue; - cpu += snapshot.get().cpu() * node.get().resources().vcpu(); - memory += snapshot.get().memory() * node.get().resources().memoryGb(); - disk += snapshot.get().disk() * node.get().resources().diskGb(); + load = load.add(snapshot.get().load().multiply(node.get().resources())); totalActiveResources = totalActiveResources.add(node.get().resources().justNumbers()); } NodeResources totalHostResources = new NodeResources(0, 0, 0, 0); - for (var host : allNodes.hosts()) { + for (var host : allNodes.hosts()) totalHostResources = totalHostResources.add(host.resources().justNumbers()); - } - Load load = new Load(divide(cpu, totalHostResources.vcpu()), - divide(memory, totalHostResources.memoryGb()), - divide(disk, totalHostResources.diskGb())); - Load activeLoad = new Load(divide(cpu, totalActiveResources.vcpu()), - divide(memory, totalActiveResources.memoryGb()), - divide(disk, totalActiveResources.diskGb())); - return new Pair<>(load, activeLoad); + return new Pair<>(load.divide(totalHostResources), load.divide(totalActiveResources)); } private static List<ApplicationStats> computeApplicationStats(NodeList allNodes, 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 1a13c1bb6d8..1407b03e8dd 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 @@ -1,6 +1,8 @@ // 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; + /** * The load of a node or system, measured as fractions of max (1.0) in three dimensions. * @@ -20,11 +22,23 @@ public class Load { public double memory() { return memory; } public double disk() { return disk; } + public Load add(Load other) { + return new Load(cpu + other.cpu(), memory + other.memory(), disk + other.disk()); + } + + public Load multiply(NodeResources resources) { + return new Load(cpu * resources.vcpu(), memory * resources.memoryGb(), disk * resources.diskGb()); + } + + public Load divide(NodeResources resources) { + return new Load(divide(cpu, resources.vcpu()), divide(memory, resources.memoryGb()), divide(disk, resources.diskGb())); + } + private double requireNormalized(double value, String name) { if (Double.isNaN(value)) - throw new IllegalArgumentException(name + " must be a number between 0 and 1, but is NaN"); - if (value < 0 || value > 1) - throw new IllegalArgumentException(name + " must be between 0 and 1, but is " + value); + throw new IllegalArgumentException(name + " must be a number but is NaN"); + if (value < 0) + throw new IllegalArgumentException(name + " must be zero or lager, but is " + value); return value; } @@ -35,4 +49,9 @@ public class Load { public static Load zero() { return new Load(0, 0, 0); } + private static double divide(double a, double b) { + if (a == 0 && b == 0) return 0; + return a / b; + } + } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricSnapshot.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricSnapshot.java index be9f7bd4819..80fa65c7828 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricSnapshot.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricSnapshot.java @@ -12,9 +12,7 @@ public class NodeMetricSnapshot implements Comparable<NodeMetricSnapshot> { private final Instant at; - private final double cpu; - private final double memory; - private final double disk; + private final Load load; private final long generation; private final boolean inService; private final boolean stable; @@ -24,9 +22,7 @@ public class NodeMetricSnapshot implements Comparable<NodeMetricSnapshot> { long generation, boolean inService, boolean stable, double queryRate) { this.at = at; - this.cpu = cpu; - this.memory = memory; - this.disk = disk; + this.load = new Load(cpu, memory, disk); this.generation = generation; this.inService = inService; this.stable = stable; @@ -34,9 +30,10 @@ public class NodeMetricSnapshot implements Comparable<NodeMetricSnapshot> { } public Instant at() { return at; } - public double cpu() { return cpu; } - public double memory() { return memory; } - public double disk() { return disk; } + public double cpu() { return load.cpu(); } // TODO: Remove + public double memory() { return load.memory(); } // TODO: Remove + public double disk() { return load.disk(); } // TODO: Remove + public Load load() { return load; } /** Queries per second */ public double queryRate() { return queryRate; } @@ -53,10 +50,8 @@ public class NodeMetricSnapshot implements Comparable<NodeMetricSnapshot> { } @Override - public String toString() { return "metrics at " + at + ":" + - " cpu: " + cpu + - " memory: " + memory + - " disk: " + disk + + public String toString() { return "metrics at " + at + ": " + + load + " generation: " + generation + " inService: " + inService + " stable: " + stable + |