diff options
author | Ola Aunronning <olaa@yahooinc.com> | 2023-09-21 13:05:22 +0200 |
---|---|---|
committer | Ola Aunronning <olaa@yahooinc.com> | 2023-09-21 13:05:22 +0200 |
commit | f7e4341d0e8dcfa31346d42df39dee3b9b7c2e59 (patch) | |
tree | bb022780dfb2913168fe1d1d57697c440f579a9c | |
parent | 7faeffcc5901ae88c1c3d1814665d0db6ca1d900 (diff) |
Cluster cost accounts for GPU resources as well
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(); |