summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-07-14 21:07:09 +0200
committerGitHub <noreply@github.com>2022-07-14 21:07:09 +0200
commit80d967ebd1e8b0639f975c75e4f03da5dec61ee3 (patch)
treeaf504357829c1699dd986517c5265a147b5b2b56
parentd782d8e6cd29c30a6639313b29afa46ff6c24514 (diff)
parent64e4efdba3750b827a071a0208cdf39810329cf0 (diff)
Merge pull request #23514 from vespa-engine/bratseth/current-load
Find current load more reliably
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java15
2 files changed, 17 insertions, 4 deletions
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 b7a5c1e7fe7..34e31671491 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
@@ -27,8 +27,6 @@ public class ClusterModel {
/** Containers typically use more cpu right after generation change, so discard those metrics */
public static final Duration warmupDuration = Duration.ofMinutes(5);
- private static final Duration currentLoadDuration = Duration.ofMinutes(5);
-
static final double idealQueryCpuLoad = 0.8;
static final double idealWriteCpuLoad = 0.95;
static final double idealMemoryLoad = 0.65;
@@ -110,8 +108,8 @@ public class ClusterModel {
return queryFractionOfMax = clusterTimeseries().queryFractionOfMax(scalingDuration(), clock);
}
- /** Returns average load during the last {@link #currentLoadDuration} */
- public Load currentLoad() { return nodeTimeseries().averageLoad(clock.instant().minus(currentLoadDuration)); }
+ /** Returns average of the last load reading from each node. */
+ public Load currentLoad() { return nodeTimeseries().currentLoad(); }
/** Returns average load during the last {@link #scalingDuration()} */
public Load averageLoad() { return nodeTimeseries().averageLoad(clock.instant().minus(scalingDuration())); }
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java
index 5ad4ef2e263..36056665a15 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java
@@ -7,6 +7,7 @@ import com.yahoo.vespa.hosted.provision.applications.Cluster;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
+import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -69,6 +70,20 @@ public class ClusterNodesTimeseries {
return total.divide(count);
}
+ /** Returns average of the latest load reading from each node */
+ public Load currentLoad() {
+ Load total = Load.zero();
+ int count = 0;
+ for (var nodeTimeseries : timeseries) {
+ Optional<NodeMetricSnapshot> last = nodeTimeseries.last();
+ if (last.isEmpty()) continue;
+
+ total = total.add(last.get().load());
+ count++;
+ }
+ return total.divide(count);
+ }
+
private static List<NodeTimeseries> keep(List<NodeTimeseries> timeseries, Predicate<NodeMetricSnapshot> filter) {
return timeseries.stream().map(nodeTimeseries -> nodeTimeseries.keep(filter)).collect(Collectors.toList());
}