https://www.lxlinux.net/6929.html (**)
https://blog.csdn.net/sanhewuyang/article/details/120735766 (详细介绍了cgroup与systemd)
https://blog.csdn.net/weixin_42788640/article/details/115492506 (**介绍比较全面)
https://article.itxueyuan.com/dXW9dg
https://zhuanlan.zhihu.com/p/538496131
https://blog.csdn.net/GaoChuang_/article/details/121710719
https://www.ctyun.cn/developer/article/423015204548677
https://mp.weixin.qq.com/s/3DiwzAGHsRR2lE1_vNDdvA
目录
一、什么是cgroup
https://www.cnblogs.com/architectforest/p/13126905.html
控制群组(control group) 是Linux kernel(Linux内核)的一项功能:
在一个系统中运行的层级制进程组,您可对其进行资源分配(如CPU时间、系统内存、网络带宽或者这些资源的组合)。
通过使用cgroup ,系统管理员在分配、排序、拒绝、管理和监控系统资源等方面,可以进行精细化控制。硬件资源可以在应用程序和用户间智能分配,从而增加整体效率。
二、cgroup的功能
cgroup是将任意进程进行分组化管理的Linux内核功能。cgroup本身提供将进程进行分组化管理的功能和接口的基础结构。实现 cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,cgroups 提供了五大功能:
资源限制(Resource limiting ):比如memory子系统可以为进程组设定一个memory使用上限,进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)
优先级控制(Prioritization):比如可以使用cpu子系统为某个进程组分配cpu share
资源统计(Accounting ):比如使用cpuacct子系统记录某个进程组使用的cpu时间
进程组隔离(Isolation):比如使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间
进程组控制(Control):比如使用freezer子系统可以将进程组挂起和恢复
三、cgroup相关概念
Task(任务): task就是表示系统的一个进程。
Cgroup(控制组): 资源控制的单位,表示一整个任务组,每个任务组被划分相应的资源,包含了一个或者多个子系统。一个任务既可以加入到这个 cgroup 中,也可以迁移到另外一个 cgroup 中去。
Subsystem(子系统): 一个资源调度器(Resource Controller,控制着CPU,内存,访问,输入输出等资源和权限。
Hierarchy(层级树):一种操作系统的组织结构,可以理解为是一个 cgroup 树,将 cgroup 串成树状结构,通过虚拟端口暴露给用户。
1.subsystem
cgroup各大子系统说明
https://www.cnblogs.com/KubeExplorer/p/17960509
在/proc/cgroups查看所有支持的subsystem,或者通过lssubsys命令。
2.cgroup文件系统接口
cgroup以文件的方式提供应用接口,我们可以通过 mount 命令来查看 cgroups 默认的挂载点。系统默认会挂载cgroup,路径为/sys/fs/cgroup,查看当前系统挂载的cgroup,可以看到在默认路径下挂载了所有的子系统。后续可以直接使用下述hierarchy作为父hierarchy。进程的cgroup可以在/proc/$pid/cgroup文件中查看。
#mount|grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,rdma)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_cls,net_prio)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
- 查看进程所属的 cgroup
可以通过 /proc/[pid]/cgroup 来查看指定进程属于哪些 cgroup:
每一行包含用冒号隔开的三列,他们的含义分别是:
1.cgroup 树的 ID, 和 /proc/cgroups 文件中的 ID 一一对应。
2.和 cgroup 树绑定的所有 subsystem,多个 subsystem 之间用逗号隔开。这里 name=systemd 表示没有和任何 subsystem 绑定,只是给他起了个名字叫 systemd。
3.进程在 cgroup 树中的路径,即进程所属的 cgroup,这个路径是相对于挂载点的相对路径。
可以使用cgroup-bin工具包中的cgexec来实现限制进程可以使用的资源。
3.Hierarchy
https://zhuanlan.zhihu.com/p/74299886
四、cgroup相关规则
五、cgroup模式
目前,cgroups 有两个版本,cgroup V1 和 cgroup V2。V1 功能相对零散,不方便维护,V2 是未来的演进方向。在这种情况下,节点存在以下面 3 种 cgroups 模式:
legacy:只支持 cgroup V1
hybrid:同时支持 cgroup V1 和 cgroup V2
unified:只支持 cgroup V2
在 containerd 中,通过以下方式判断处于哪种模式:
const unifiedMountpoint = "/sys/fs/cgroup"
// Mode returns the cgroups mode running on the host
func Mode() CGMode {
checkMode.Do(func() {
var st unix.Statfs_t
// 没挂载 /sys/fs/cgroup
if err := unix.Statfs(unifiedMountpoint, &st); err != nil {
cgMode = Unavailable
return
}
switch st.Type {
case unix.CGROUP2_SUPER_MAGIC:
// /sys/fs/cgroup 挂载为 cgroup2 文件系统格式
cgMode = Unified
default:
cgMode = Legacy
if err := unix.Statfs(filepath.Join(unifiedMountpoint, "unified"), &st); err != nil {
return
}
// /sys/fs/cgroup/unified 挂载为 cgroup2 文件系统格式
if st.Type == unix.CGROUP2_SUPER_MAGIC {
cgMode = Hybrid
}
}
})
return cgMode
}
六、cgroup与cgroup2
https://developer.aliyun.com/article/1205050
-
v2与v1的主要区别
v2 版本与v1相比,在目录组织上更清晰,管理更方便,在 cgroup v2 中,去掉了层级(hierarchy)的概念,只有一个层级,所有 cgroup 在该层级中以树形的方式组织,每个 cgroup 可以管理多种资源。
https://www.51cto.com/article/599391.html -
如何检查当前内核版本是否支持cgroup v2?
方法是:查看文件系统是否支持cgroup2[root@node1 ~]# grep cgroup /proc/filesystems nodev cgroup nodev cgroup2
七、cgroup与systemd
http://wjhsh.net/sparkdev-p-9523194.html
1)Systemd 依赖 cgroups
systemd 也是对于 Cgroup 接口的一个封装
2)Systemd 默认挂载的 cgroups 系统
在系统的开机阶段,systemd 会把支持的 controllers (subsystem 子系统)挂载到默认的 /sys/fs/cgroup/ 目录下面。
八、cgroup示例
https://cloud.tencent.com/developer/article/2118809
九、cgroup源码原理深度解析
https://blog.csdn.net/hu1610552336/article/details/118642410 (包含示例)
0 条评论