在 Docker 中挂载 cgroup 进行资源管理

Bio*_*dle 6 linux resources cgroups 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命令上传递内存/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 --cpuset-cpus。这显然意味着我没有为 Docker 安装这些不同的 cgroup 来正确管理资源,对吧?

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

Bio*_*dle 8

经过大量研究后,我发现了这一点,以防其他人也遇到同样的问题。

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

来自第 2.1 节 - 基本用法

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

挂载 -t cgroup xxx /sys/fs/cgroup

“xxx”不由 cgroup 代码解释,但会出现在 /proc/mounts 中,因此可能是您喜欢的任何有用的标识字符串。

注意:如果没有一些用户输入,某些子系统将无法工作。例如,如果启用了 cpuset,则用户必须先为创建的每个新 cgroup 填充 cpus 和 mems 文件,然后才能使用该组。”

然而,对于这种特殊情况,尝试挂载单个 cgroup(例如 cpuset)会导致错误,提示“cpuset 特殊设备不存在”。这是因为 Raspbian Jessie 8 的开发人员没有配置内核来支持 Docker 默认用于资源管理的 cgroup。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 文档中显示的那样。