Post

Docker - Cgroup

Docker - Cgroup

Docker - Cgroup

  • linux的cgroup提供了对一组进程及其将来子进程的资源限制、控制和统计能力
    • 这些资源包括CPU、内存、存储、网络等
  • 也就是通过cgroup可以对每个容器使用的硬件资源进行限制

Linux Cgroup

  • cgroup是对进程分组管理的一种机制
    • 一个cgroup包含一组进程, 并可以在这个cgroup上增加Linux subsystem的各种参数配置, 将一组进程和一组subsystem的系统参数关联起来
  • subsystem是一组资源控制的模块
    • 每个subsystem会关联到定义了相应限制的cgroup上, 并对这个cgroup中的进程做相应的限制和控制
  • hierarchy的功能是把一组cgroup串成一个树状的结构
    • 通过这种树状结构, cgroups可以做到继承
  • Linux通过虚拟文件系统实现cgroup
    • /sys/fs/cgroup

ls /sys/fs/cgroup

1
2
blkio       cpuacct     devices     hugetlb     misc        net_prio    pids        unified
cpu         cpuset      freezer     memory      net_cls     perf_event  rdma

三个组件间的关系

  • 在/sys/fs/cgroup下, 每个文件夹其实就对应了一种资源
    • 以cpu为例
  • 在cpu文件夹下有subsystem相关的配置
    • tasks中的内容表示受这个subsys限制的PID
    • cpu.cfs_quota_us表示cpu占用率
  • 如果在这个文件夹下创建一个自己的文件夹
    • 这就相当于在hierarchy下创建了一个子cgroup, 并且会继承父节点的配置
    • 这个文件夹会自己创建配置文件, 可以对这个子cgroup再进行cpu subsystem配置

go操作cgroup示例

1
2
3
4
5
6
7
// 对mem进行限制示例
// 在默认挂载了memory subsyetem的hierarchy上创建cgroup
os.Mkdir(path.Join("/sys/fs/cgroup/memory", "my_mem_limit"), 0755)
// 将容器进程加入到cgroup中, 将容器PID写入到tasks文件中
io.WriteFile(path.Join("/sys/fs/cgroup/memory", "my_mem_limit", "tasks"), []byte(strconv.Itoa(cmd.Process.Pid)), 0644)
// 限制容器进程memory使用, 将配置信息写入memory.limit_in_bytes文件中
io.WriteFile(path.Join("/sys/fs/cgroup/memory", "my_mem_limit", "memory.limit_in_bytes"), []byte("100m"), 0644)
This post is licensed under CC BY 4.0 by the author.