对于CPUSET子系统我们主要解释对cpuset.cpus的操作。Read操作根据《cgroup学习(三)——伪文件》可以很容易的跟踪到代码,并解读,所以我们这里就不赘述,直接解释write及attach操作。首先我们看一下write操作的bt(使用systemtap见《使用systemtap获得内核函数的局部变量》):

[html] view plain copy
  1. sudo sh -c "echo 0-3 > cpuset.cpus"
  2. 13219 (sh) cpuset_change_cpumask call trace:
  3. 0xffffffff810c2fc0 :cpuset_change_cpumask+0x0/0x20 [kernel]
  4. 0xffffffff810bfc6b :cgroup_scan_tasks+0x17b/0x270 [kernel]
  5. 0xffffffff810c4c2c :cpuset_write_resmask+0x17c/0x350 [kernel]
  6. 0xffffffff810be14f :cgroup_file_write+0x16f/0x320 [kernel]
  7. 0xffffffff81177e68 :vfs_write+0xb8/0x1a0 [kernel]
  8. 0xffffffff81178871 : sys_write+0x51/0x90[kernel]
  9. 0xffffffff8100b0f2 :system_call_fastpath+0x16/0x1b [kernel]

注:cpuset在attach之前要求先设置cpus及mems的值,如果tasks里没有task的话,也不会调用到cpuset_change_cpumask,会在前面返回。
      因为代码被优化的原因所有在cpuset_write_resmask与cgroup_scan_tasks之间的update_cpumask及update_tasks_cpumask函数被优化掉了,其中前者主要完成参数的解析,验证(validate_change这个新的值必须是它的parent的子集,并且它的所有children还必须是新值的子集,以及exclusive的排除),然后才将新的值cpumask_copy(cs->cpus_allowed,trialcs->cpus_allowed);最后才更新它下面的所有进程的cpus_allowed(这里只是更新它这级的进程,并没有更新它下级的cgroup里面的进程,因为这些进程由这个子cgroup自己管理,它们也还是新值的一个子集)update_tasks_cpumask(该函数主要初始化一个cgroup_scanner结构,cgroup用它来遍历cgroup管理的每个进程,并定义对每个进程的test及process操作),然后就到了cgroup_scan_tasks函数,它就是扫描cgroup_scanner(即cgroup下的每个进程,使用cgroup_iter_{start,next,end}三个接口),这里使用了一个大顶堆(key为进程的create_time)来缓存需要更新的进程,这样做的原因是:保证在更新的过程中新创建的进程也会被更新到,所以这里有一个goto语句,直到heap->size=0才跳出,这样就可以减少在fork的代码里加锁。最后就是对heap里面的所有进程进行process处理cpuset_change_cpumask,该函数最终就把cgroup的cpus_allowed复制到task->cpus_allowed,并且判断这个进程是否从旧的CPU运行队列,迁移到新的CPUSET的运行队列(该过程由migrate_task完成)。
注:这里用到了cgroup最重要的几结构之间的转换,所以我们再画一张简易的图来表示一下:


图 cgroup 与task的转换

第一行从cgroup查找CPUSET子系统对应的控制体实现类,subsys[]数组保存了该cgroup所属的所有子系统抽象类,最后通过container_of获得实现类(注:container_of是中task_group内存储了整个cgroup_subsys_state内容,而不是指向cgroup_subsys_state的指针);第二行是从cgroup控制体的CPUSET子系统实现类到它所属的cgroup再到该cgroup所管理的所有tasks,这里cgroup_iter->cg_link则保存cgroup的css_set list,而cgroup_iter->task则分别保存每次css_set的task list,即task会因为遍历的css_set而变化。(这些结构关系见《cgroup学习(二)——cgroup框架结构》)
     可以看出整个wirte过程,最终的目的就是在于更新该cgroup下的每个进程的cpus_allowed,并对已在运行队列里或正在运行的进程进行迁移。下面我们再来看一下cpuset的attach过程:
     通过《cgroup学习(三)——伪文件》表格的cpuset_subsys全局变量,我们可以找到CPUSET子系统的attach函数为:cpuset_attach,可以想象代码应该就是把新的cgroup的cpu_allowed赋到将要attach的task的cpu_allowed,然后该迁移的迁移,不过如果你看代码的话会发现其实不是这样的,多了一个guarantee_online_cpus函数,一开始百想不得其解,后来查了一下online cpu的概念才明白,原来linux可以把物理cpu直接禁止掉(修改/sys/devices/system/cpu下的所有core目录下的online文件,这也就是CPU的热插拔),所以这个函数的目的就是排除掉所有offline的cpu后的cpu_allowed。有了cpu_allowed进程在被创建时wake_up_new_task(继承自父进程的cpu_allowed)或者被唤醒时try_to_wake_up,都会通过select_task_rq(该函数后面调用CFS调度器里的select_task_rq_fair来选择cpu_allowed里的某一个cpu,可能是load最低的)来确定它应该被置于哪个CPU的运行队列及运行,一个进程在某一时刻只能存在于一个CPU的运行队列里。

cgroup学习(八)——CPUSET子系统相关推荐

  1. 关于cgroup 学习

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

  2. 方差 标准差_方差与标准差——杭州市初中数学核心组寒假微课学习八年级第38课...

    国家正值非常时期,开学已经推迟,为响应"在推迟开学时段,指导各地各校充分利用'互联网+'的模式共享优质教育资源,开展远程教育教学活动和学生课业辅导,努力实现我市广大中小学校学'停课不停学', ...

  3. OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

    OpenCV与图像处理学习八--图像边缘提取(Canny检测代码) 一.图像梯度 1.1 梯度 1.2 图像梯度 二.梯度图与梯度算子 2.1模板卷积 2.2 梯度图 2.3 梯度算子 2.3.1 R ...

  4. PyTorch框架学习八——PyTorch数据读取机制(简述)

    PyTorch框架学习八--PyTorch数据读取机制(简述) 一.数据 二.DataLoader与Dataset 1.torch.utils.data.DataLoader 2.torch.util ...

  5. JMS学习八(ActiveMQ消息持久化)

    JMS学习八(ActiveMQ消息持久化) ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可 ...

  6. 推荐系统遇上深度学习(八十七)-[阿里]基于搜索的用户终身行为序列建模

    本文介绍的论文是<Search-based User Interest Modeling with Lifelong Sequential Behavior Data for Click-Thr ...

  7. [Java并发包学习八]深度剖析ConcurrentHashMap

    转载----http://qifuguang.me/2015/09/10/[Java并发包学习八]深度剖析ConcurrentHashMap/ HashMap是非线程安全的,并发情况下使用,可能会导致 ...

  8. C1认证学习八(域名解析)

    C1认证学习八(域名解析) 任务背景 为了可以准确的访问某台计算机上的服务,在OSI七层模型中的网络层,通过IP地址进行唯一的标记每一台计算机的位置了啦. 但是由于纯数字难以记忆,所以说,出现了域名使 ...

  9. IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)

    本文由金蝶随手记技术团队丁同舟分享. 1.引言 跟移动端IM中追求数据传输效率.网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 J ...

  10. linux cgroup学习总结

    linux-cgroup使用 大纲 概念 安装与使用 概念 基础知识 cgroups 是Linux内核提供的一种可以限制,隔离单个进程或者多个进程组 (process groups)所使用物理资源的机 ...

最新文章

  1. 【全文】Libra回应质疑:Facebook将放弃控制权,不与主权货币竞争
  2. Oracle安装ORA-12154和ORA-12169问题的解决
  3. Eclipse 报java.lang.OutOfMemoryError: PermGen space
  4. 计算机网络-RIP协议
  5. 基于采购订单的MIRO校验过程
  6. CorelDRAW中将矩形变圆角的方法
  7. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
  8. C语言之strstr函数类似Java字符串的contain函数
  9. mysql时间段以后_mysql时间段查询
  10. 去大公司和小公司实习对比
  11. (十七)Java springcloud B2B2C o2o多用户商城 springcloud架构-消息驱动 Spring Cloud Stream...
  12. 离别海润光伏:杨怀进的“轮回怪圈”
  13. js插件编写常用工具函数及格式
  14. 【数据库实验】《小型MIS的开发》PyQt5 开发 民航票务管理系统
  15. github 搜索_如何通过GitHub快速的搜索资源?
  16. 贺利坚老师汇编课程46笔记:操作符offset取得标号的偏移地址
  17. crc可以检出奇数个错误_计算机网络学习笔记 3.3 差错控制
  18. 电力电子技术复习笔记1(简要版)
  19. 苹果手机设置信任软件
  20. JavaScript之切换背景图片(并使)背景栏保持和背景色调相似

热门文章

  1. poj 1753 Flip Game (高斯消元 + 枚举 自由变量)
  2. java 快速排序流程图_java简单快速排序实例解析
  3. HTTPS 使用certbot升级过期证书
  4. 敏捷开发用户场景分析
  5. STL sort的危险之处
  6. [文摘20080908]哈佛大学成功25句
  7. java基础(十四)-----详解匿名内部类——Java高级开发必须懂的
  8. Logstash匹配日志日期
  9. linux 安装tuxedo
  10. mysql配置my.cnf文件,以及参数优化提升性能