在 Docker 中安装用于资源管理的 cgroup

Mounting cgroups for Resource Management in Docker

这是参考 https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory。我已经使用 Raspbian Jessie Lite(本质上是无 GUI 的 Debian Jessie)在 Raspberry Pi(64 位)上创建了工作容器 运行 Docker 版本 18.05.0-ce ).

文档声称您可以在 docker run 命令上传递 memory/cpu 标志。但是当我尝试像 docker run -it --name test --memory=512m container_os 这样的东西时,它说:

WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap

如果我传递基于 cpu 的标志(例如 --cpuset-cpus),我会收到类似的消息,提示我没有安装 cpuset。这显然意味着我没有为 Docker 安装这些不同的 cgroups 来正确管理资源,对吧?

现在提到 https://docs.docker.com/config/containers/runmetrics/#control-groups,我阅读了有关 cgroups 的部分,但这对我理解情况并没有太大帮助。因此,除了尝试随机内核命令之外,有经验的人是否可以逐步解释如何以正确的方式执行此操作?

经过相当多的研究,我弄明白了,以防其他人遇到同样的问题。

参考 https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt,这对理解 cgroups 非常有帮助,具有所有适当支持的内核应该默认安装 docker 的大部分 cgroups。如果没有,有一个命令可以这样做:

来自第 2.1 节 - 基本用法

"要挂载包含所有可用子系统的 cgroup 层次结构,请键入:

mount -t cgroup xxx /sys/fs/cgroup

"xxx"不被cgroup代码解释,而是会出现在 /proc/mounts 所以可能是您喜欢的任何有用的识别字符串。

注意:某些子系统在没有用户先输入的情况下无法工作。例如, 如果启用了 cpuset,用户将必须填充 cpus 和 mems 文件 对于在可以使用该组之前创建的每个新 cgroup."

然而,对于这种特殊情况,尝试挂载单个 cgroup(例如 cpuset)会导致错误,指出 "cpuset special device does not exist"。这是因为 Raspbian Jessie 8 的开发者没有配置内核来支持 Docker 默认用于资源管理的 cgroups。这可以通过键入 docker info 命令轻松确定,并在输出的底部看到:

WARNING: No swap limit support WARNING: No cpu cfs quota support WARNING: No cpu cfs period support WARNING: No cpuset support

这些是 Docker 管理容器内存和 CPU 资源所需的所有 cgroup。测试您的内核是否支持 cpuset 之类的东西很容易。如果文件 /proc/filesystems 有一个条目说 nodev cpuset,那么这意味着你的内核有 cpuset 支持,但如果你正在阅读这篇文章,那么它可能意味着它只是没有在你的内核中配置。然而,这将需要重新配置和重建内核,这并不容易。

使用正确的内核配置,它就像 Docker 文档中显示的那样自动运行。