一文搞懂ss/css/css_set/cgroup/hierarchy的关系

基础定义

task_struct

在搞懂ss、css等一系列内核数据结构之前,先要了解task。

每个进程在内核中都维护了一个task_struct结构,里面包含了这个进程执行的所有信息。
cpu对进程的管理都是通过task_struct来执行的。

struct task_struct {
   
#ifdef CONFIG_CGROUPS
	//进程所属的css_set
	struct css_set __rcu		*cgroups;
	// 同属一个css_set的task的链表,将使用同一个css_set的task链接在一起
	struct list_head		cg_list;
#endif
    ... ...
}

Cgroup

全称control groups。是绑定了一组限制或者参数的进程集合。

cgroup数据结构实际上是cgroup结构的抽象,没有直接关联属于该cgroup的进程和资源限制,而是包含了该cgroup的相关信息。

struct cgroup {
   
	// cgroup所在的css
	struct cgroup_subsys_state self; 
    
    // 未使用时id=0,root cgroup始终为1,
    int id;
    // cgroup所在层级,即当前cgroup的深度
    int level;
     // 每当有个非空的css_set和这个cgroup关联的时候,就增加计数1
    int populated_cnt;
    
	struct kernfs_node *kn;		/* cgroup kernfs entry */
	struct cgroup_file procs_file;	/* handle for "cgroup.procs" */
	struct cgroup_file events_file;	/* handle for "cgroup.events" */

    // 与该cgroup关联的所有子系统,CGROUP_SUBSYS_COUNT为支持的css种类,一个种类最多与一个cgroup层级关联
	struct cgroup_subsys_state __rcu *subsys[CGROUP_SUBSYS_COUNT];

    // cgroup所在hierarchy的根节点
	struct cgroup_root *root;
    
    // 关联的css_set链表的表头(可以获取到该cgroup所有的css_set)
    struct list_head cset_links;

	// 保存BPF程序
	struct cgroup_bpf bpf;
    
    ... ...
};

在/proc/[pid]/cgroup中可以看到该进程pid所属的cgroup

# 查看一个docker容器的cgorup
[root@x86 ~] cat /proc/483664/cgroup
11:perf_event:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
10:devices:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
9:cpu,cpuacct:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
8:memory:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
7:hugetlb:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
6:cpuset:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
5:pids:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
4:blkio:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
3:net_cls:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
2:freezer:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
1:name=systemd:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282

# 查看当前所有cgroup
[root@x86 systemd]# lscgroup
freezer:/
freezer:/docker
freezer:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
net_cls:/
net_cls:/docker
net_cls:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
blkio:/
blkio:/docker
blkio:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
pids:/
pids:/docker
pids:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
cpuset:/
cpuset:/docker
cpuset:/docker/2af72b99af9a8b883849289133a5c570a8df1e5b6506ee197a187ca655de3282
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值