docker 没有 /sys/fs/cgroup/cpu/docker这个目录
Posted 琦彦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker 没有 /sys/fs/cgroup/cpu/docker这个目录相关的知识,希望对你有一定的参考价值。
docker 没有 /sys/fs/cgroup/cpu/docker这个目录
问题现象
用户执行 docker run 时的参数指定cpu了,比如这样一条命令:
docker run -d --name test-cpu --cpu-period=100000 --cpu-quota=20000 nginx
在启动这个容器后,我们可以通过查看 Cgroups 文件系统下,CPU 子系统中,“docker”这个控制组里的资源限制文件的内容来确认:
预期效果
cat /sys/fs/cgroup/cpu/docker/7be62ae914a3/cpu.cfs_period_us
100000
cat /sys/fs/cgroup/cpu/docker/7ee16258ec08/cpu.cfs_quota_us
20000
这就意味着这个 Docker 容器,只能使用到 20% 的 CPU 带宽。
但在某些机器提示
[root@gpunode2 ~]# cd /sys/fs/cgroup/cpu/docker
-bash: cd: /sys/fs/cgroup/cpu/docker: 没有那个文件或目录
问题分析
Linux 容器依赖于控制组 ,这些控制组不仅跟踪进程组,还公开有关 CPU、内存和块 I/O 使用情况的指标。您也可以访问这些指标并获取网络使用指标。这与“纯”LXC 容器以及 Docker 容器有关。
控制组通过伪文件系统公开。在最近的发行版中,您应该在/sys/fs/cgroup
. 在该目录下,您会看到多个子目录,称为 devices、freezer、blkio 等;每个子目录实际上对应一个不同的 cgroup 层次结构。
在较旧的系统上,控制组可能安装在 上/cgroup
,没有明显的层次结构。在这种情况下,您看到的不是子目录,而是该目录中的一堆文件,可能还有一些与现有容器相对应的目录。
要确定控制组的安装位置,您可以运行:
$ grep cgroup /proc/mounts
cgroup
cgroups 的文件布局在 v1 和 v2 之间有很大的不同。
**如果/sys/fs/cgroup/cgroup.controllers
存在于您的系统上,则您使用的是 v2,否则您使用的是 v1。**请参阅与您的 cgroup 版本对应的小节。
cgroup v2 默认用于以下发行版:
- Fedora(31 起)
- Debian GNU/Linux(从 11 开始)
- Ubuntu(自 21.10 起)
cgroup v1
您可以查看/proc/cgroups
系统已知的不同控制组子系统、它们所属的层次结构以及它们包含的组数。
您还可以查看/proc/<pid>/cgroup
进程所属的控制组。控制组显示为相对于层次挂载点根的路径。/
表示该进程尚未分配给组,而/lxc/pumpkin
表示该进程是名为 的容器的成员pumpkin
。
cgroup v2
在 cgroup v2 主机上, 的内容/proc/cgroups
没有意义。请参阅/sys/fs/cgroup/cgroup.controllers
可用的控制器。
更改 cgroup 版本
更改 cgroup 版本需要重新启动整个系统。
在基于 systemd 的系统上,可以通过添加systemd.unified_cgroup_hierarchy=1
到内核 cmdline 来启用 cgroup v2。要将 cgroup 版本恢复为 v1,您需要改为设置systemd.unified_cgroup_hierarchy=0
。
如果grubby
您的系统上有可用的命令(例如在 Fedora 上),可以按如下方式修改 cmdline:
$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"
如果grubby
命令不可用,请编辑该GRUB_CMDLINE_LINUX
行/etc/default/grub
并运行sudo update-grub
.
在 cgroup v2 上运行 Docker
Docker 从 Docker 20.10 开始支持 cgroup v2。在 cgroup v2 上运行 Docker 还需要满足以下条件:
- 容器化:v1.4 或更高版本
- runc:v1.0.0-rc91 或更高版本
- 内核:v4.15或更高版本(推荐v5.2或更高版本)
请注意,cgroup v2 模式的行为与 cgroup v1 模式略有不同:
- 默认 cgroup 驱动程序 (
dockerd --exec-opt native.cgroupdriver
) 在 v2 上是“systemd”,在 v1 上是“cgroupfs”。 - 默认的 cgroup 命名空间模式 (
docker run --cgroupns
) 在 v2 上是“private”,在 v1 上是“host”。 docker run
标志--oom-kill-disable
和--kernel-memory
在 v2 上被丢弃。
查找给定容器的 cgroup
对于每个容器,在每个层次结构中创建一个 cgroup。在具有旧版本 LXC 用户空间工具的旧系统上,cgroup 的名称是容器的名称。对于更新版本的 LXC 工具,cgroup 是lxc/<container_name>.
对于使用 cgroups 的 Docker 容器,容器名称是容器的完整 ID 或长 ID。如果一个容器在 中显示为 ae836c95b4c3 docker ps
,它的长 ID 可能类似于 ae836c95b4c3c9e9179e0e91015512da89fdec91612f63cebae57df9a5444c79
. docker inspect
您可以使用或进行查找docker ps --no-trunc
。
将所有内容放在一起查看 Docker 容器的内存指标,请查看以下路径:
/sys/fs/cgroup/memory/docker/<longid>/
在 cgroup v1 上,cgroupfs
驱动程序/sys/fs/cgroup/memory/system.slice/docker-<longid>.scope/
在 cgroup v1 上,systemd
驱动程序/sys/fs/cgroup/docker/<longid/>
在 cgroup v2 上,cgroupfs
驱动程序/sys/fs/cgroup/system.slice/docker-<longid>.scope/
在 cgroup v2 上,systemd
驱动程序
参考文章:https://docs.docker.com/config/containers/runmetrics/#control-groups
以上是关于docker 没有 /sys/fs/cgroup/cpu/docker这个目录的主要内容,如果未能解决你的问题,请参考以下文章
cadvisor 运行报错/sys/fs/cgroup/cpuacct,cpu: no such file or directory