diff options
author | Valerij Fredriksen <freva@users.noreply.github.com> | 2020-01-02 14:20:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-02 14:20:09 +0100 |
commit | 6ce166d564d40a4f9c48e825df861d3419735206 (patch) | |
tree | f32d4ecbf3a1dca9d8d2365cab2f2d2fb890edc7 | |
parent | 869e9e83274e037cae548ac5eb3c72881e90859a (diff) | |
parent | 6a7bd6bbba185d7033d0e86faae8c369ed04c59f (diff) |
Merge pull request #11628 from vespa-engine/freva/normalized-vcpu-capping
Normalized vcpu capping
9 files changed, 40 insertions, 15 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java index d51717d2c5c..0e8caf728f1 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java @@ -216,7 +216,7 @@ public class NodeSpec { return resources; } - public double vcpus() { + public double vcpu() { return resources.vcpu(); } @@ -518,8 +518,8 @@ public class NodeSpec { return this; } - public Builder vcpus(double vcpus) { - return resources(resources.withVcpu(vcpus)); + public Builder vcpu(double vcpu) { + return resources(resources.withVcpu(vcpu)); } public Builder memoryGb(double memoryGb) { diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java index 28764c6a7f2..ecf451b2555 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java @@ -43,6 +43,14 @@ public interface NodeAgentContext extends TaskContext { String vespaUserOnHost(); /** + * The vcpu value in NodeSpec is multiplied by the speedup factor per cpu core compared to a historical baseline + * for a particular cpu generation of the host (see flavors.def cpuSpeedup). + * + * @return node vcpu without the cpu speedup factor. + */ + double unscaledVcpu(); + + /** * This method is the inverse of {@link #pathInNodeFromPathOnHost(Path)}} * * @param pathInNode absolute path in the container diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java index 304664e541b..0d3b02c2bd8 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java @@ -40,11 +40,15 @@ public class NodeAgentContextImpl implements NodeAgentContext { private final Path pathToVespaHome; private final String vespaUser; private final String vespaUserOnHost; + private final double cpuSpeedup; public NodeAgentContextImpl(NodeSpec node, Acl acl, AthenzIdentity identity, DockerNetworking dockerNetworking, ZoneApi zone, Path pathToContainerStorage, Path pathToVespaHome, - String vespaUser, String vespaUserOnHost) { + String vespaUser, String vespaUserOnHost, double cpuSpeedup) { + if (cpuSpeedup <= 0) + throw new IllegalArgumentException("cpuSpeedUp must be positive, was: " + cpuSpeedup); + this.node = Objects.requireNonNull(node); this.acl = Objects.requireNonNull(acl); this.containerName = ContainerName.fromHostname(node.hostname()); @@ -56,6 +60,7 @@ public class NodeAgentContextImpl implements NodeAgentContext { this.logPrefix = containerName.asString() + ": "; this.vespaUser = vespaUser; this.vespaUserOnHost = vespaUserOnHost; + this.cpuSpeedup = cpuSpeedup; } @Override @@ -99,6 +104,11 @@ public class NodeAgentContextImpl implements NodeAgentContext { } @Override + public double unscaledVcpu() { + return node.vcpu() / cpuSpeedup; + } + + @Override public Path pathOnHostFromPathInNode(Path pathInNode) { if (! pathInNode.isAbsolute()) throw new IllegalArgumentException("Expected an absolute path in the container, got: " + pathInNode); @@ -186,6 +196,7 @@ public class NodeAgentContextImpl implements NodeAgentContext { private String vespaUser; private String vespaUserOnHost; private FileSystem fileSystem = FileSystems.getDefault(); + private double cpuSpeedUp = 1; public Builder(NodeSpec node) { this.nodeSpecBuilder = new NodeSpec.Builder(node); @@ -258,6 +269,11 @@ public class NodeAgentContextImpl implements NodeAgentContext { return this; } + public Builder cpuSpeedUp(double cpuSpeedUp) { + this.cpuSpeedUp = cpuSpeedUp; + return this; + } + public NodeAgentContextImpl build() { return new NodeAgentContextImpl( nodeSpecBuilder.build(), @@ -288,7 +304,8 @@ public class NodeAgentContextImpl implements NodeAgentContext { Optional.ofNullable(pathToContainerStorage).orElseGet(() -> fileSystem.getPath("/home/docker")), Optional.ofNullable(pathToVespaHome).orElseGet(() -> fileSystem.getPath("/opt/vespa")), Optional.ofNullable(vespaUser).orElse("vespa"), - Optional.ofNullable(vespaUserOnHost).orElse("container_vespa")); + Optional.ofNullable(vespaUserOnHost).orElse("container_vespa"), + cpuSpeedUp); } } } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java index 0c6ee546166..0e651383adc 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java @@ -353,9 +353,9 @@ public class NodeAgentImpl implements NodeAgent { .map(appId -> containerCpuCap.with(FetchVector.Dimension.APPLICATION_ID, appId.serializedForm())) .orElse(containerCpuCap) .with(FetchVector.Dimension.HOSTNAME, context.node().hostname()) - .value() * context.node().vcpus(); + .value() * context.unscaledVcpu(); - return ContainerResources.from(cpuCap, context.node().vcpus(), context.node().memoryGb()); + return ContainerResources.from(cpuCap, context.unscaledVcpu(), context.node().memoryGb()); } private boolean noCpuCap(ZoneApi zone) { diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java index 9cdb815a8ec..9b392395045 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java @@ -110,7 +110,7 @@ public class RealNodeRepositoryTest { assertThat(node.state(), is(NodeState.active)); assertThat(node.wantedRestartGeneration().get(), is(0L)); assertThat(node.currentRestartGeneration().get(), is(0L)); - assertEquals(1, node.vcpus(), delta); + assertEquals(1, node.vcpu(), delta); assertEquals(4, node.memoryGb(), delta); assertEquals(100, node.diskGb(), delta); } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java index aacb2cafd30..7776bf1f224 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java @@ -33,7 +33,7 @@ public class DockerFailTest { .flavor("docker") .wantedRestartGeneration(1L) .currentRestartGeneration(1L) - .vcpus(1) + .vcpu(1) .memoryGb(1) .diskGb(1) .build()); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java index 8163f90e31f..a09c6a9e907 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java @@ -28,7 +28,7 @@ public class MultiDockerTest { tester.addChildNodeRepositoryNode( new NodeSpec.Builder(nodeSpec2) .state(NodeState.dirty) - .vcpus(1) + .vcpu(1) .memoryGb(1) .diskGb(1) .build()); @@ -51,7 +51,7 @@ public class MultiDockerTest { .flavor("docker") .wantedRestartGeneration(1L) .currentRestartGeneration(1L) - .vcpus(2) + .vcpu(2) .memoryGb(4) .diskGb(1) .build(); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java index bb18e261301..9a25e4188f9 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java @@ -263,7 +263,7 @@ public class NodeAdminStateUpdaterTest { .state(NodeState.active) .type(NodeType.tenant) .flavor("docker") - .vcpus(1) + .vcpu(1) .memoryGb(1) .diskGb(1) .build()) @@ -276,7 +276,7 @@ public class NodeAdminStateUpdaterTest { .state(hostState) .type(NodeType.tenant) .flavor("default") - .vcpus(1) + .vcpu(1) .memoryGb(1) .diskGb(1) .build()); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java index 63f980efd91..f07c63c9f4c 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java @@ -54,7 +54,7 @@ public class NodeAgentImplTest { .hostname(hostName) .type(NodeType.tenant) .flavor("docker") - .vcpus(MIN_CPU_CORES) + .vcpu(MIN_CPU_CORES) .memoryGb(MIN_MAIN_MEMORY_AVAILABLE_GB) .diskGb(MIN_DISK_AVAILABLE_GB); @@ -239,7 +239,7 @@ public class NodeAgentImplTest { nodeAgent.doConverge(firstContext); NodeAgentContext secondContext = createContext(specBuilder.diskGb(200).build()); nodeAgent.doConverge(secondContext); - NodeAgentContext thirdContext = createContext(specBuilder.vcpus(4).build()); + NodeAgentContext thirdContext = new NodeAgentContextImpl.Builder(specBuilder.vcpu(5).build()).cpuSpeedUp(1.25).build(); nodeAgent.doConverge(thirdContext); ContainerResources resourcesAfterThird = ContainerResources.from(0, 4, 16); mockGetContainer(dockerImage, resourcesAfterThird, true); |