mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
Soften limitation of update kernel memory
Kernel memory is not allowed to be updated if container is running, it's not actually a precise kernel limitation. Before kernel version 4.6, kernel memory will not be accounted until kernel memory limit is set, if a container created with kernel memory initialized, kernel memory is accounted as soon as process created in container, so kernel memory limit update is allowed afterward. If kernel memory is not initialized, kernel memory consumed by processes in container will not be accounted, so we can't update the limit because the account will be wrong. So update kernel memory of a running container with kernel memory initialized is allowed, we should soften the limitation by docker. Signed-off-by: Qiang Huang <h.huangqiang@huawei.com>
This commit is contained in:
@@ -120,17 +120,27 @@ func (s *DockerSuite) TestUpdateKernelMemory(c *check.C) {
|
||||
|
||||
name := "test-update-container"
|
||||
dockerCmd(c, "run", "-d", "--name", name, "--kernel-memory", "50M", "busybox", "top")
|
||||
_, _, err := dockerCmdWithError("update", "--kernel-memory", "100M", name)
|
||||
// Update kernel memory to a running container is not allowed.
|
||||
c.Assert(err, check.NotNil)
|
||||
dockerCmd(c, "update", "--kernel-memory", "100M", name)
|
||||
|
||||
// Update kernel memory to a running container with failure should not change HostConfig
|
||||
c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "52428800")
|
||||
c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "104857600")
|
||||
|
||||
file := "/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes"
|
||||
out, _ := dockerCmd(c, "exec", name, "cat", file)
|
||||
c.Assert(strings.TrimSpace(out), checker.Equals, "104857600")
|
||||
}
|
||||
|
||||
func (s *DockerSuite) TestUpdateKernelMemoryUninitialized(c *check.C) {
|
||||
testRequires(c, DaemonIsLinux, kernelMemorySupport)
|
||||
|
||||
name := "test-update-container"
|
||||
dockerCmd(c, "run", "-d", "--name", name, "busybox", "top")
|
||||
_, _, err := dockerCmdWithError("update", "--kernel-memory", "100M", name)
|
||||
// Update kernel memory to a running container without kernel memory initialized is not allowed.
|
||||
c.Assert(err, check.NotNil)
|
||||
|
||||
dockerCmd(c, "pause", name)
|
||||
_, _, err = dockerCmdWithError("update", "--kernel-memory", "100M", name)
|
||||
c.Assert(err, check.NotNil)
|
||||
c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "52428800")
|
||||
dockerCmd(c, "unpause", name)
|
||||
|
||||
dockerCmd(c, "stop", name)
|
||||
|
||||
Reference in New Issue
Block a user