diff options
author | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-03-08 12:33:44 +0100 |
---|---|---|
committer | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-03-08 12:33:44 +0100 |
commit | b172653f49ecd77d998e7a0161a96f6110dfcb1a (patch) | |
tree | 506331bc3fc67947e5ef59a3bc9641c9cef174c2 /node-admin | |
parent | 7e51084bc313996886f4398818a55989a4ad95e4 (diff) |
Set container CPU cap on container create
Diffstat (limited to 'node-admin')
4 files changed, 16 insertions, 17 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java index 3a01bc0bbd3..5c0e8f81704 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java @@ -13,7 +13,7 @@ import java.util.Optional; public interface DockerOperations { - void createContainer(NodeAgentContext context, ContainerData containerData); + void createContainer(NodeAgentContext context, ContainerData containerData, ContainerResources containerResources); void startContainer(NodeAgentContext context); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java index 38dbd8e05f6..42d442deddf 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java @@ -53,7 +53,7 @@ public class DockerOperationsImpl implements DockerOperations { } @Override - public void createContainer(NodeAgentContext context, ContainerData containerData) { + public void createContainer(NodeAgentContext context, ContainerData containerData, ContainerResources containerResources) { context.log(logger, "Creating container"); // IPv6 - Assume always valid @@ -64,8 +64,7 @@ public class DockerOperationsImpl implements DockerOperations { Docker.CreateContainerCommand command = docker.createContainerCommand( context.node().getWantedDockerImage().get(), context.containerName()) .withHostName(context.node().getHostname()) - .withResources(ContainerResources.from( - 0, context.node().getMinCpuCores(), context.node().getMinMainMemoryAvailableGb())) + .withResources(containerResources) .withManagedBy(MANAGER_NAME) .withUlimit("nofile", 262_144, 262_144) // The nproc aka RLIMIT_NPROC resource limit works as follows: 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 781b036e484..c4bef1fcc2f 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 @@ -202,7 +202,7 @@ public class NodeAgentImpl implements NodeAgent { private void startContainer(NodeAgentContext context) { ContainerData containerData = createContainerData(context); - dockerOperations.createContainer(context, containerData); + dockerOperations.createContainer(context, containerData, getContainerResources(context.node())); dockerOperations.startContainer(context); lastCpuMetric = new CpuUsageReporter(); 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 577f8e9573d..bb11961d346 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 @@ -168,7 +168,7 @@ public class NodeAgentImplTest { nodeAgent.stopForHostSuspension(); nodeAgent.doConverge(context); - inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any()); + inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any(), any()); inOrder.verify(dockerOperations, times(1)).startContainer(eq(context)); inOrder.verify(dockerOperations, times(0)).startServices(eq(context)); // done as part of startContainer inOrder.verify(dockerOperations, times(1)).resumeNode(eq(context)); @@ -200,7 +200,7 @@ public class NodeAgentImplTest { final InOrder inOrder = inOrder(dockerOperations, orchestrator, nodeRepository, aclMaintainer, healthChecker); inOrder.verify(dockerOperations, times(1)).pullImageAsyncIfNeeded(eq(dockerImage)); - inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any()); + inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any(), any()); inOrder.verify(dockerOperations, times(1)).startContainer(eq(context)); inOrder.verify(aclMaintainer, times(1)).converge(eq(context)); inOrder.verify(dockerOperations, times(1)).resumeNode(eq(context)); @@ -310,7 +310,7 @@ public class NodeAgentImplTest { inOrder.verify(orchestrator).resume(any(String.class)); inOrder.verify(orchestrator).suspend(any(String.class)); inOrder.verify(dockerOperations).removeContainer(eq(secondContext), any()); - inOrder.verify(dockerOperations, times(1)).createContainer(eq(secondContext), any()); + inOrder.verify(dockerOperations, times(1)).createContainer(eq(secondContext), any(), any()); inOrder.verify(dockerOperations).startContainer(eq(secondContext)); inOrder.verify(dockerOperations, never()).updateContainer(any(), any()); @@ -343,7 +343,7 @@ public class NodeAgentImplTest { fail("Expected to throw an exception"); } catch (OrchestratorException ignored) { } - verify(dockerOperations, never()).createContainer(eq(context), any()); + verify(dockerOperations, never()).createContainer(eq(context), any(), any()); verify(dockerOperations, never()).startContainer(eq(context)); verify(orchestrator, never()).resume(any(String.class)); verify(nodeRepository, never()).updateNodeAttributes(any(String.class), any(NodeAttributes.class)); @@ -382,7 +382,7 @@ public class NodeAgentImplTest { // First time we fail to resume because health verification fails verify(orchestrator, times(1)).suspend(eq(hostName)); verify(dockerOperations, times(1)).removeContainer(eq(context), any()); - verify(dockerOperations, times(1)).createContainer(eq(context), any()); + verify(dockerOperations, times(1)).createContainer(eq(context), any(), any()); verify(dockerOperations, times(1)).startContainer(eq(context)); verify(orchestrator, never()).resume(eq(hostName)); verify(nodeRepository, never()).updateNodeAttributes(any(), any()); @@ -391,7 +391,7 @@ public class NodeAgentImplTest { // Do not reboot the container again verify(dockerOperations, times(1)).removeContainer(eq(context), any()); - verify(dockerOperations, times(1)).createContainer(eq(context), any()); + verify(dockerOperations, times(1)).createContainer(eq(context), any(), any()); verify(orchestrator, times(1)).resume(eq(hostName)); verify(nodeRepository, times(1)).updateNodeAttributes(eq(hostName), eq(new NodeAttributes() .withRebootGeneration(wantedRebootGeneration))); @@ -437,7 +437,7 @@ public class NodeAgentImplTest { // Should only be called once, when we initialize verify(dockerOperations, times(1)).getContainer(eq(context)); verify(dockerOperations, never()).removeContainer(eq(context), any()); - verify(dockerOperations, never()).createContainer(eq(context), any()); + verify(dockerOperations, never()).createContainer(eq(context), any(), any()); verify(dockerOperations, never()).startContainer(eq(context)); verify(orchestrator, never()).resume(any(String.class)); verify(nodeRepository, never()).updateNodeAttributes(eq(hostName), any()); @@ -510,7 +510,7 @@ public class NodeAgentImplTest { inOrder.verify(storageMaintainer, times(1)).archiveNodeStorage(eq(context)); inOrder.verify(nodeRepository, times(1)).setNodeState(eq(hostName), eq(NodeState.ready)); - verify(dockerOperations, never()).createContainer(eq(context), any()); + verify(dockerOperations, never()).createContainer(eq(context), any(), any()); verify(dockerOperations, never()).startContainer(eq(context)); verify(dockerOperations, never()).suspendNode(eq(context)); verify(dockerOperations, times(1)).stopServices(eq(context)); @@ -564,7 +564,7 @@ public class NodeAgentImplTest { nodeAgent.doConverge(context); verify(dockerOperations, times(1)).removeContainer(eq(context), any()); - verify(dockerOperations, times(1)).createContainer(eq(context), any()); + verify(dockerOperations, times(1)).createContainer(eq(context), any(), any()); verify(dockerOperations, times(1)).startContainer(eq(context)); } @@ -626,7 +626,7 @@ public class NodeAgentImplTest { } catch (DockerException ignored) { } verify(dockerOperations, never()).removeContainer(eq(context), any()); - verify(dockerOperations, times(1)).createContainer(eq(context), any()); + verify(dockerOperations, times(1)).createContainer(eq(context), any(), any()); verify(dockerOperations, times(1)).startContainer(eq(context)); verify(nodeAgent, never()).resumeNodeIfNeeded(any()); @@ -636,7 +636,7 @@ public class NodeAgentImplTest { nodeAgent.doConverge(context); verify(dockerOperations, times(1)).removeContainer(eq(context), any()); - verify(dockerOperations, times(2)).createContainer(eq(context), any()); + verify(dockerOperations, times(2)).createContainer(eq(context), any(), any()); verify(dockerOperations, times(2)).startContainer(eq(context)); verify(nodeAgent, times(1)).resumeNodeIfNeeded(any()); } @@ -746,7 +746,7 @@ public class NodeAgentImplTest { final InOrder inOrder = inOrder(dockerOperations, orchestrator, nodeRepository, aclMaintainer); inOrder.verify(dockerOperations, times(1)).pullImageAsyncIfNeeded(eq(dockerImage)); - inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any()); + inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any(), any()); inOrder.verify(dockerOperations, times(1)).startContainer(eq(context)); inOrder.verify(aclMaintainer, times(1)).converge(eq(context)); inOrder.verify(dockerOperations, times(1)).resumeNode(eq(context)); |