在Docker中挂载cgroups以进行资源管理

时间:2018-07-09 23:10:21

标签: linux docker resources cgroups

这是指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-cpus),则会收到类似的消息,说明未安装cpuset。显然,这意味着我没有为Docker正确安装资源而安装这些不同的cgroup,对吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

从2.1节开始-基本用法

要安装具有所有可用子系统的cgroup层次结构,请输入:

mount -t cgroup xxx / sys / fs / cgroup

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

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

但是,对于这种特殊情况,尝试挂载单个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 Docs中一样自动运行。