summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValerij Fredriksen <freva@users.noreply.github.com>2020-01-02 14:20:09 +0100
committerGitHub <noreply@github.com>2020-01-02 14:20:09 +0100
commit6ce166d564d40a4f9c48e825df861d3419735206 (patch)
treef32d4ecbf3a1dca9d8d2365cab2f2d2fb890edc7
parent869e9e83274e037cae548ac5eb3c72881e90859a (diff)
parent6a7bd6bbba185d7033d0e86faae8c369ed04c59f (diff)
Merge pull request #11628 from vespa-engine/freva/normalized-vcpu-capping
Normalized vcpu capping
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java6
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java8
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java21
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java4
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java2
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java2
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java4
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java4
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java4
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);