在 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 文档中显示的那样自动运行。
这是参考 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 文档中显示的那样自动运行。