Linux cgroup技术

cgroup 全称是 control group,顾名思义,它是用来做"控制"的。控制什么东西呢?当然是资源的使用了。

cgroup 定义了下面的一系列子系统,每个子系统用于控制某一类资源。

  • CPU 子系统,主要限制进程的 CPU 使用率。
  • cpuacct 子系统,可以统计 cgroup 中的进程的 CPU 使用报告。
  • cpuset 子系统,可以为 cgroup 中的进程分配单独的 CPU 节点或者内存节点。
  • memory 子系统,可以限制进程的 Memory 使用量。
  • blkio 子系统,可以限制进程的块设备 IO。
  • devices 子系统,可以控制进程能够访问某些设备。
  • net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  • freezer 子系统,可以挂起或者恢复 cgroup 中的进程。

在 Linux 上,为了操作 cgroup,有一个专门的 cgroup 文件系统,我们运行 mount 命令可以查看。

复制代码
# mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)

cgroup 文件系统多挂载到 /sys/fs/cgroup 下,通过上面的命令行,我们可以看到我们可以用 cgroup 控制哪些资源。

在 /sys/fs/cgroup/ 下面能看到下面的目录结构。

复制代码
drwxr-xr-x 5 root root  0 May 30 17:00 blkio
lrwxrwxrwx 1 root root 11 May 30 17:00 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 May 30 17:00 cpuacct -> cpu,cpuacct
drwxr-xr-x 5 root root  0 May 30 17:00 cpu,cpuacct
drwxr-xr-x 3 root root  0 May 30 17:00 cpuset
drwxr-xr-x 5 root root  0 May 30 17:00 devices
drwxr-xr-x 3 root root  0 May 30 17:00 freezer
drwxr-xr-x 3 root root  0 May 30 17:00 hugetlb
drwxr-xr-x 5 root root  0 May 30 17:00 memory
lrwxrwxrwx 1 root root 16 May 30 17:00 net_cls -> net_cls,net_prio
drwxr-xr-x 3 root root  0 May 30 17:00 net_cls,net_prio
lrwxrwxrwx 1 root root 16 May 30 17:00 net_prio -> net_cls,net_prio
drwxr-xr-x 3 root root  0 May 30 17:00 perf_event
drwxr-xr-x 5 root root  0 May 30 17:00 pids
drwxr-xr-x 5 root root  0 May 30 17:00 systemd

cgroup 对于 Docker 资源的控制,在用户态的表现如下图所示:

cgroup 是一种特殊的文件系统。它的定义如下:

复制代码
struct file_system_type cgroup_fs_type = {
  .name = "cgroup",
  .mount = cgroup_mount,
  .kill_sb = cgroup_kill_sb,
  .fs_flags = FS_USERNS_MOUNT,
};

内核中 cgroup 的工作机制:

第一步,系统初始化的时候,初始化 cgroup 的各个子系统的操作函数,分配各个子系统的数据结构。

第二步,mount cgroup 文件系统,创建文件系统的树形结构,以及操作函数。

第三步,写入 cgroup 文件,设置 cpu 或者 memory 的相关参数,这个时候文件系统的操作函数会调用到 cgroup 子系统的操作函数,从而将参数设置到 cgroup 子系统的数据结构中。

第四步,写入 tasks 文件,将进程交给某个 cgroup 进行管理,因为 tasks 文件也是一个 cgroup 文件,统一会调用文件系统的操作函数进而调用 cgroup 子系统的操作函数,将 cgroup 子系统的数据结构和进程关联起来。

第五步,对于 CPU 来讲,会修改 scheduled entity,放入相应的队列里面去,从而下次调度的时候就起作用了。对于内存的 cgroup 设定,只有在申请内存的时候才起作用。

此文章为12月Day5学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

相关推荐
博观而约取11 分钟前
Linux 和 macOS 终端中常见的快捷键操作
linux·运维·macos
林政硕(Cohen0415)41 分钟前
Linux驱动开发进阶(三)- 热插拔机制
linux·驱动开发·热插拔
wangjun515944 分钟前
linux,物理机、虚拟机,同时内外网实现方案;物理机与虚拟机互通网络;
linux·服务器·网络
杰克崔1 小时前
分析sys高问题的方法总结
linux·运维·服务器
WSSWWWSSW1 小时前
安装nfs客户端(centos)
linux·运维·centos
李迟2 小时前
跨系统平台实践:在内网自建kylin服务版系统yum源
linux
odoo-卜永2 小时前
ubuntu22.04连接爱普生打印机型号L385
linux·经验分享·ubuntu
小麦嵌入式3 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
刘若水3 小时前
Linux: 进程信号初识
linux·运维·服务器
共享家95275 小时前
深入剖析Linux常用命令,助力高效操作
linux·运维·服务器