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

猜你喜欢

转载自blog.csdn.net/fly910905/article/details/123718418