aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOla Aunronning <olaa@yahooinc.com>2023-09-21 13:05:22 +0200
committerOla Aunronning <olaa@yahooinc.com>2023-09-21 13:05:22 +0200
commitf7e4341d0e8dcfa31346d42df39dee3b9b7c2e59 (patch)
treebb022780dfb2913168fe1d1d57697c440f579a9c
parent7faeffcc5901ae88c1c3d1814665d0db6ca1d900 (diff)
Cluster cost accounts for GPU resources as well
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java8
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java9
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java13
3 files changed, 22 insertions, 8 deletions
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 0d21b155571..c1eb3be4275 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
@@ -157,6 +157,10 @@ public class NodeResources {
return new NodeResources.GpuResources(1, thisMem - otherMem);
}
+ public GpuResources multipliedBy(double factor) {
+ return new GpuResources(this.count, this.memoryGb * factor);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -329,10 +333,12 @@ public class NodeResources {
}
public NodeResources multipliedBy(double factor) {
+ if (isUnspecified()) return this;
return this.withVcpu(vcpu * factor)
.withMemoryGb(memoryGb * factor)
.withDiskGb(diskGb * factor)
- .withBandwidthGbps(bandwidthGbps * factor);
+ .withBandwidthGbps(bandwidthGbps * factor)
+ .with(gpuResources.multipliedBy(factor));
}
private boolean isInterchangeableWith(NodeResources other) {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
index eed2a9ec991..6ee1a8b56d7 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
@@ -231,13 +231,8 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
}
public static double cost(ClusterResources clusterResources, SystemName systemName) {
- NodeResources nr = clusterResources.nodeResources();
- return cost(new ResourceAllocation(nr.vcpu(), nr.memoryGb(), nr.diskGb(), nr.architecture()).multiply(clusterResources.nodes()), systemName);
- }
-
- private static double cost(ResourceAllocation allocation, SystemName systemName) {
- var resources = new NodeResources(allocation.getCpuCores(), allocation.getMemoryGb(), allocation.getDiskGb(), 0);
- return cost(resources, systemName);
+ var totalResources = clusterResources.nodeResources().multipliedBy(clusterResources.nodes());
+ return cost(totalResources, systemName);
}
private static double cost(NodeResources resources, SystemName systemName) {
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
index fac05fc125f..8f9ba75f95c 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.controller.maintenance;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.ClusterResources;
import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.NodeType;
@@ -123,6 +124,18 @@ public class ResourceMeterMaintainerTest {
assertEquals(lastRefreshTime + millisAdvanced, tester.curator().readMeteringRefreshTime());
}
+ @Test
+ public void testClusterCost() {
+ var nodeResources = new NodeResources(10, 64, 100, 10,
+ NodeResources.DiskSpeed.fast,
+ NodeResources.StorageType.local,
+ NodeResources.Architecture.x86_64,
+ new NodeResources.GpuResources(2, 16));
+ var clusterResources = new ClusterResources(5, 1, nodeResources);
+
+ assertEquals(5 * nodeResources.cost(), ResourceMeterMaintainer.cost(clusterResources, SystemName.Public), 0.001);
+ }
+
private void setUpZones() {
ZoneApiMock zone1 = ZoneApiMock.newBuilder().withId("prod.region-2").build();
ZoneApiMock zone2 = ZoneApiMock.newBuilder().withId("test.region-3").build();