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

6
这是关于https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory的内容。我已经创建了工作容器,在 Raspberry Pi(64位)上运行 Docker 版本为 18.05.0-ce,使用 Raspbian Jessie Lite(基本上是无 GUI 的 Debian Jessie)。
文档声称您可以在docker run命令中传递内存/cpu标志。但是当我尝试像这样的东西:docker run -it --name test --memory=512m container_os时,它会说: 警告:您的内核不支持交换限制功能或 cgroup 没有挂载。内存被限制而没有交换 如果我传递基于 CPU 的标志,例如 --cpuset-cpus,则会收到有关未挂载 cpuset 的类似消息。这显然意味着我没有为 Docker 管理资源正确挂载这些不同的 cgroups,对吧?
现在参考https://docs.docker.com/config/containers/runmetrics/#control-groups,我阅读了有关 cgroups 的部分,但对我的情况并没有什么帮助。所以,与其随机尝试内核命令,不如有经验的人给出一步一步正确操作的解释呢?
1个回答

7

经过一番研究,我找到了解决方法,如果还有其他人遇到同样的问题,可以参考以下内容。

参考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中,因此可能是任何有用的标识字符串。

注意:某些子系统需要用户先进行一些操作才能正常工作。例如,如果启用了cpusets,则用户必须为每个新创建的cgroup填充cpus和mems文件,然后才能使用该组。

然而,在这种特定情况下,尝试挂载单个cgroup(例如cpuset)会导致错误,指出“cpuset特殊设备不存在”。这是因为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资源所需的所有cgroups。测试内核是否支持类似cpuset的功能很容易。如果文件/proc/filesystems中有一个条目说nodev cpuset,那么这意味着您的内核具有cpuset支持,但如果您正在阅读此内容,则可能意味着它只是未在您的内核中配置。这将需要重新配置和重建内核,这并不容易。

有了正确的内核配置,就像Docker文档中所述的那样,它会自动工作。


另一个有用的资源,关于内存交换能力问题,请参考此链接:https://docs.docker.com/install/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities - Bionic_Beadle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接