Docker——cgroups

发布时间:2026/6/14 12:33:33

Docker——cgroups 控制群组control group在此指南中简写为 cgroup是 Linux kernel 的一项功能在一个系统中运行的层级制进程组您可对其进行资源分配如 CPU 时间、系统内存、网络带宽或者这些资源的组合。通过使用 cgroup系统管理员在分配、排序、拒绝、管理和监控系统资源等方面可以进行精细化控制。硬件资源可以在应用程序和用户间智能分配从而增加整体效率。控制群组可对进程进行层级式分组并标记并对其可用资源进行限制。传统情况下所有的进程分得的系统资源数量相近管理员用进程 niceness 值进行调节。而用此方法包含大量进程的应用程序可以比包含少量进程的应用程序获得更多资源这与应用程序的重要程度无关。为了管理资源cgroups引入了几个核心概念它们共同构成了cgroups的组织结构任务task在cgroups中一个任务就是指系统里的一个进程。控制组cgroup这是cgroups的核心。它代表按照某种资源控制标准划分而成的一个进程组。资源限制就是以控制组为单位生效的。例如我们可以创建一个名为mycontainer的控制组并规定这个组里的所有进程最多只能使用1个CPU核心和1GB内存。子系统subsystem子系统就是具体的资源控制器。每个子系统负责控制一种特定的资源。比如cpu子系统控制CPU时间分配memory子系统控制内存使用量。层级hierarchy控制组可以组织成树状结构这就是层级。一个层级通过绑定一个或多个子系统来对树中的控制组进行资源调度。子节点控制组会继承父节点的属性。1、资源管控器资源管控器也称为 cgroup 子系统代表一种单一资源如 CPU 时间或者内存。Linux kernel 提供一系列资源管控器由 systemd 自动挂载。如需参考目前已挂载的资源管控器列表请参见 /proc/cgroups或使用 lssubsys 监控工具。[rootAnolis2 ~]# more /proc/cgroups#subsys_name hierarchy num_cgroups enabledcpuset 11 5 1cpu 9 54 1cpuacct 9 54 1blkio 3 54 1memory 7 81 1devices 2 54 1freezer 13 5 1net_cls 6 5 1perf_event 4 5 1net_prio 6 5 1hugetlb 12 5 1pids 10 67 1ioasids 5 1 1rdma 8 5 1或者[rootAnolis2 ~]# ls /sys/fs/cgroup/blkio cpuacct cpuset freezer ioasids net_cls net_prio pids systemdcpu cpu,cpuacct devices hugetlb memory net_cls,net_prio perf_event rdma详细介绍• blkio —— 对输入 ∕ 输出访问存取块设备设定权限• cpu —— 使用 CPU 调度程序让 cgroup 的任务可以存取 CPU。它与 cpuacct 管控器一起挂载在同一 mount 上• cpuacct —— 自动生成 cgroup 中任务占用 CPU 资源的报告。它与 cpu 管控器一起挂载在同一 mount 上• cpuset —— 给 cgroup 中的任务分配独立 CPU在多芯系统中和内存节点• devices —— 允许或禁止 cgroup 中的任务存取设备• freezer —— 暂停或恢复 cgroup 中的任务• memory —— 对 cgroup 中的任务可用内存做出限制并且自动生成任务占用内存资源报告• net_cls —— 使用等级识别符classid标记网络数据包这让 Linux 流量控制器tc 指令可以识别来自特定 cgroup 任务的数据包• perf_event —— 允许使用 perf 工具来监控 cgroup• hugetlb —— 允许使用大篇幅的虚拟内存页并且给这些内存页强制设定可用资源量。下载内核文档[rootAnolis2 memory]# yum install kernel-doc[rootAnolis2 memory]# ls -l /usr/share/doc/kernel-doc-4.18.0-553.111.1.el8_10/Documentation/cgroup-v1/总用量 180-r--r--r-- 1 root root 939 2月 28 13:10 00-INDEX-r--r--r-- 1 root root 15532 2月 28 13:10 blkio-controller.txt-r--r--r-- 1 root root 26828 2月 28 13:10 cgroups.txt-r--r--r-- 1 root root 1972 2月 28 13:10 cpuacct.txt-r--r--r-- 1 root root 37865 2月 28 13:10 cpusets.txt-r--r--r-- 1 root root 4370 2月 28 13:10 devices.txt-r--r--r-- 1 root root 4909 2月 28 13:10 freezer-subsystem.txt-r--r--r-- 1 root root 1714 2月 28 13:10 hugetlb.txt-r--r--r-- 1 root root 8119 2月 28 13:10 memcg_test.txt-r--r--r-- 1 root root 37701 2月 28 13:10 memory.txt-r--r--r-- 1 root root 1267 2月 28 13:10 net_cls.txt-r--r--r-- 1 root root 2513 2月 28 13:10 net_prio.txt-r--r--r-- 1 root root 3108 2月 28 13:10 pids.txt-r--r--r-- 1 root root 4410 2月 28 13:10 rdma.txtcgroups.txtcgroup-v1 总纲基础概念、挂载、使用方法memory.txt内存控制组MemCG完整文档限制进程内存、缓存、OOM 等cpusets.txtCPU 核心绑定指定进程只能用哪些 CPU 核心blkio-controller.txt磁盘 I/O 限速限制读写速度devices.txt设备权限控制允许 / 禁止进程访问硬件测试首先进入cpu子系统对应的层级路径下cd /sys/fs/cgroup/cpu/通过新建文件夹创建一个cpu控制族群mkdir cg1即新建了一个cpu控制族群cg1新建cg1之后可以看到目录下自动建立了相关的文件这些文件是伪文件。我们的测试示例主要用到cpu.cfs_period_us和cpu.cfs_quota_us两个文件。cpu.cfs_period_uscpu分配的周期(微秒默认为100000。cpu.cfs_quota_us表示该control group限制占用的时间微秒默认为-1表示不限制。如果设为50000表示占用50000/1000050%的CPU。这里我们设置占用30%的CPU即把cpu.cfs_quota_us设置为30000。编写测试脚本运行后top查看可以看到cpu占用100%将该进程放到新建的control group中[rootAnolis2 ~]# echo 4012 /sys/fs/cgroup/cpu/cg1/tasks其实就把该进程号4012写入到control group的tasks文件中再次查看top命令执行情况可以看到cpu.sh程序占用的cpu控制在30%左右。

相关新闻