mount hierarchy

该过程对应于mount -t cgroup -o cpu,cpuset cpuandset /cgroup
         首先它解析mount参数-o ***:parse_cgroupfs_option,创建一个新的cgroupfs_root:cgroup_root_from_opts,通过cgroup_test_super判断新的mount subsys是否与已有的hierarchy一样(它们的subsys一样或者name一样),如果一样则使用原来的cgroupfs_root;否则使用新的cgroupfs_root,接着把相应的subsys初始化到该root的top_cgroup里(rebind_subsystems);
        然后分配css_set_count(当前所有的css_set个数)个cg_cgroup_link,再建立top_cgrop到所有css_set(css_set_table[]里的所有node)的关系(link_css_set):通过刚才创建的cg_cgroup_link建立css_set与cgroup(这里就是top_cgroup)的关系,把cg_cgroup_link的cg指向当前的css_set,cgrp指向当前 cgroup(top_cgroup),然后再把该cg_cgroup_link分别移到该cgroup->css_sets list,及css_set->cg_links的末尾(其实就是cg_cgroup_link->cg与cg_cgroup_link->cgrp构成该结构的主键,而cg_cgroup_link->cgrp_link_list是css_set的索引,cg_cgroup_link->cg_link_list是cgroup的索引):

[cpp] view plain copy
  1. hlist_for_each_entry(cg, node, hhead, hlist)
  2. link_css_set(&tmp_cg_links, cg, root_cgrp);
  3. static void link_css_set(struct list_head *tmp_cg_links,
  4. struct css_set *cg, struct cgroup *cgrp)
  5. {
  6. struct cg_cgroup_link *link;
  7. BUG_ON(list_empty(tmp_cg_links));
  8. link = list_first_entry(tmp_cg_links, struct cg_cgroup_link,
  9. cgrp_link_list);
  10. link->cg = cg;
  11. link->cgrp = cgrp;
  12. atomic_inc(&cgrp->count);
  13. list_move(&link->cgrp_link_list, &cgrp->css_sets);
  14. /*
  15. * Always add links to the tail of the list so that the list
  16. * is sorted by order of hierarchy creation
  17. */
  18. list_add_tail(&link->cg_link_list, &cg->cg_links);
  19. }

这里需要建立所有css_set与top_cgroup的关系是因为top_cgroup包括所有的进程,而所有的进程也就包括了所有的css_set。
        最后生成该cgroup相应的文件:cgroup_populate_dir(top_cgroup),首先生成基本文件cgroup_add_files;然后生成每个subsys自己的文件:

[cpp] view plain copy
  1. for_each_subsys(cgrp->root, ss) {
  2. if (ss->populate && (err = ss->populate(ss, cgrp)) < 0)
  3. return err;
  4. }

我们通过systemtap来确认该过程:

[html] view plain copy
  1. sudo mount -t cgroup -o memory,cpuset mc /cgroup/memory/
  2. 46144380 8071 (mount) call trace:
  3. 0xffffffff81054e60 :cpu_cgroup_populate+0x0/0x30 [kernel]
  4. 0xffffffff810c007a :cgroup_populate_dir+0x7a/0x110 [kernel]
  5. 0xffffffff810c0cbb : cgroup_get_sb+0x42b/0x520[kernel]
  6. 0xffffffff8117aa7b :vfs_kern_mount+0x7b/0x1b0 [kernel]
  7. 0xffffffff8117ac22 :do_kern_mount+0x52/0x130 [kernel]
  8. 0xffffffff81199302 : do_mount+0x2d2/0x8d0[kernel]
  9. 0xffffffff81199990 : sys_mount+0x90/0xe0[kernel]
  10. 0xffffffff8100b0f2 :system_call_fastpath+0x16/0x1b [kernel]

通过把同样的subsys mount到两个不同的目录/cgroup/a,/cgroup/b,可以发现该信息只打印一次,当在其中的一个目录下创建一个新的目录(mkidr /cgroup/a/123)后,则在/cgroup/b也可以看到该目录,说明它们使用同一个cgroupfs_root(hierarchy),即它们是同一个东西只是在两个不同的目录而已。该过程可以简单总结为:解析参数,创建当前所有的css_set与top_cgroup的关系,生成目录及文件。

cgroup学习(四)——mount hierarchy相关推荐

  1. 关于cgroup 学习

    一.前言 cgroup在K8S中有重要应用,K8S参考书籍: kubernetes权威指南第5版 公司一个项目用linux 的 cgroup 技术来限制进场cpu和内存使用,具有非常好的学习意义,所以 ...

  2. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  3. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  4. python学习四(处理数据)

    python学习四(处理数据) head first python中的一个数据处理的例子 有四个U10选手的600米成绩,请取出每个选手跑的最快的3个时间.以下是四位选手的9次成绩 James 2-3 ...

  5. PyTorch框架学习四——计算图与动态图机制

    PyTorch框架学习四--计算图与动态图机制 一.计算图 二.动态图与静态图 三.torch.autograd 1.torch.autograd.backward() 2.torch.autogra ...

  6. (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...

  7. 算法学习四:算法性能分析理论基础——函数增长与渐进分析

    算法学习四:算法性能分析理论基础--函数增长与渐进分析 在算法性能分析过程中,特别是在算法运行效率分析中,我们经常使用渐渐分析法,它使我们在分析算法性能时不必纠结于不同硬件平台的差异性,着重考虑算法的 ...

  8. Tensorflow学习四---高阶操作

    Tensorflow学习四-高阶操作 Merge and split 1.tf.concat 拼接 a = tf.ones([4,32,8]) b = tf.ones([2,32,8]) print( ...

  9. [jQuery学习系列四 ]4-Jquery学习四-事件操作

    [jQuery学习系列四 ]4-Jquery学习四-事件操作 前言: 今天看知乎偶然看到中国有哪些类似于TED的节目, 回答中的一些推荐我给记录下来了, 顺便也在这里贴一下: 一席 云集 听道 推酷 ...

  10. AVI音视频封装格式学习(四)——linux系统C语言AVI格式音视频封装应用

    拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题.RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视频流和一个2 ...

最新文章

  1. DG1062可编程信号源
  2. Windows 2003下的Http 500错误
  3. I2C_ADDRS(addr, addrs...)理解
  4. mysql shell 所有表_备份mysql所有数据库的每个表的shell脚本
  5. redis主从架构宕机问题手动解决
  6. mysql数据库简单介绍_数据库的简单介绍
  7. 阿里云java mysql环境_阿里云搭建centos java mysql nginx环境
  8. 2017.9.21 所驼门王的宝藏 思考记录
  9. 山东大学2020计算机考研学硕,2020山东大学考研学硕复试分数线
  10. 成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'express'
  11. linux之安装Apache服务
  12. UIPIckerView现实城市选择
  13. Deepin使用苹果主题
  14. html日期默认,html日期控件默认设置为当天日期
  15. c语言笔试题大题带答案,c语言常见笔试题及答案
  16. 设计模式之抽象工厂模式(Abstract Factory)
  17. 源恒房地产税务软件土地增值税清算系统
  18. So Far Away
  19. 十分钟理解线性代数的本质_线性代数的本质
  20. android wear2.0 更新,又一批手表获得Android Wear 2.0更新

热门文章

  1. 网页加密编码的几种常见方法
  2. win10连接共享打印机_win7共享出来的打印机部分电脑无法连接的问题
  3. matlab练习程序(图像错切)
  4. spring cloud构建互联网分布式微服务云平台-高可用的服务注册中心
  5. AES算法,DES算法,RSA算法JAVA实现
  6. 解决ant编译中出现“includeantruntime was not set”警告的问题
  7. 区块链+”来了,区块链金融将如何颠覆传统金融
  8. web CSS的知识- 关于后代选择器,子选择器,兄弟选择器的使用
  9. DevExpress控件TExtLookupComboBox实现多列模糊匹配输入的方法
  10. ubuntu 下 apache2 查看 已加载的模块 命令