《奔跑吧linux内核》3.3笔记,不足之处还望大家批评指正

根据实际物理属性,CPU域分类如图1所示。

图1 CPU域分类

问题一:一个4核处理器中的每个物理CPU拥有独立L1 cache且不支持超线程技术,分成两个簇cluster0和cluster1,每个簇包含两个物理CPU核,簇中的CPU核共享L2cache。请画出该处理器在Linux内核里调度域和调度组的拓扑关系图。

  4核处理器关系图如图2所示,在不支持超线程技术的情况下,每个CPU核心只有一个执行线程,所以4核处理器没有SMT属性。cluster由两个CPU物理核组成,这两个CPU是MC层级且是兄弟关系。整个处理器可以看作DIE级别,因此该处理器只有两个层级,即MC和DIE。根据上述原则,画图图3所示上述4核处理器的调度域和调度组的拓扑关系图。

图2 4核处理器示意图

图3 4核处理器调度域和调度组的拓扑关系图

问题二:假设CPU0和CPU1同属于一个调度域中且它们都不是idle CPU,那么CPU1可以做负载均衡吗?

  CPU1不可以做负载均衡,默认约定优先由调度域中第一个CPU做负载均衡。此时,只有CPU0能做负载均衡,或者当CPU0不是空闲CPU,CPU1处于idle状态,CPU1才可以做负载均衡。

问题三:如何查找出一个调度域里最繁忙的调度组?

  在find_busiest_group()函数中,简单归纳步骤如下:

  1)首先遍历该调度域中每个调度组,计算各个调度组中的平均负载等相关信息;

  2)根据平均负载,找出最繁忙的调度组;

  3)获取本地调度组的平均负载(avg_load)和最繁忙调度组的平均负载,以及该调度域的平均负载;

  4)本地调度组的平均负载大于最繁忙组的平均负载,或者本地调度组的平均负载大于调度域的平均负载,说明不适合做负载均衡,退出此次负载均衡处理;

  5)根据最繁忙组的平均负载、调度域的平均负载和本地调度组的平均负载来计算该调度域的需要迁移的负载不均衡值。

问题四:如果一个调度域负载不平衡,请问如何计算需要迁移多少负载量呢?

  计算方式如图4所示。当最繁忙的调度组合本地调度组都出现group_overloaded的情况下才会计算load_above_capacity,busiest.gcf指最繁忙调度组里的group_capacity_factor。公式查看最繁忙调度组的平均负载(组里每个CPU的平均负载,不是组的总负载)和本地调度组的平均负载,以及整个调度域的平均负载的差值来计算该调度域的负载不均衡值(env->imbalance)。最后如果计算出来的不均衡值比最繁忙域里的每个进程平均负载小,那么调用fix_small_imbalance()函数,该函数计算最小的不均衡值。(SCHED_CAPACITY_SCALE为1024)

图4 需要迁移的负载量的计算方式

问题五:使用内核提供的唤醒进程API,比如wake_up_process()来唤醒一个进程,那么进程唤醒后应该在哪个CPU上运行呢?是调用wake_up_process()的那个CPU,还是该进程之前运行的那个CPU,或者其他CPU呢?

  唤醒CPU记作wakeup CPU,上次运行的CPU称为prev CPU。

  如果设置了SD_BALANCE_WAKE,在select_idle_sibling()函数中,优先选择idle CPU。如果没有idle CPU,就只能选择wakeup CPU和prev CPU。当找到一个具有亲和性的调度域且wakeup CPU和prev CPU不是一个CPU,wake_affine()函数会重新计算wakeup CPU和prev CPU的负载情况,如果wakeup CPU的负载加上被唤醒进程的负载比prev CPU小,那么wakeup CPU可以唤醒进程,否则选择prev CPU。

  对于没有设置SD_BALANCE_WAKE的情况,变量sd指系统调度域中和sd_flag有相同标志位的调度域,然后开始向下遍历查找最悠闲的调度组和最悠闲的CPU唤醒进程。

Linux内核——进程管理之SMP负载均衡(基于版本4.x)的更多相关文章

  1. Linux内核——进程管理与调度

    进程的管理与调度 进程管理 进程描写叙述符及任务结构 进程存放在叫做任务队列(tasklist)的双向循环链表中.链表中的每一项包括一个详细进程的全部信息,类型为task_struct,称为进程描写叙 ...

  2. Linux内核——进程管理之CFS调度器(基于版本4.x)

    <奔跑吧linux内核>3.2笔记,不足之处还望大家批评指正 建议阅读博文https://www.cnblogs.com/openix/p/3262217.html理解linux cfs调 ...

  3. Linux内核 ——进程管理之进程诞生(基于版本4.x)

    <奔跑吧linux内核>3.1笔记,不足之处还望大家批评指正 进程是Linux内核最基本的抽象之一,它是处于执行期的程序.它不仅局限于一段可执行代码(代码段),还包括进程需要的其他资源.在 ...

  4. linux内核 进程管理

    进程和线程 进程不单单包含可执行代码(代码段),好包含打开的文件,挂起的信号,处理器状态,虚拟内存地址等. 线程:从内核的角度来说,它并没有线程这个概念.Linux把所有线程都当做进程来实现.内核并没 ...

  5. linux内核——进程管理

    在讲进程之前先说一下进程的堆栈的吧: 1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同一时候,会为进程创建对应的堆栈.每一个进程会有两个栈,一个用户栈.存在于用户空间,一个内核栈 ...

  6. Linux内核电源管理综述

    资料:http://blog.csdn.net/bingqingsuimeng/article/category/1228414http://os.chinaunix.net/a2006/0519/1 ...

  7. Linux操作系统的进程管理

    Linux操作系统的进程管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程相关概念 1>.进程概述 内核的功用: 进程管理.文件系统.网络功能.内存管理.驱动程序. ...

  8. linux 系统管理--进程管理

    目录 linux 系统管理--进程管理 一.进程基本概述 二.监控进程状态 三.进程的优先级[进阶] 四.企业案例,Linux假死是怎么回事 五.后台进程管理 六.系统平均负载[进阶] linux 系 ...

  9. Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)

    Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...

随机推荐

  1. bzoj 3160: 万径人踪灭【FFT+manacher】

    考虑正难则反,我们计算所有对称子序列个数,再减去连续的 这里减去连续的很简单,manacher即可 然后考虑总的,注意到关于一个中心对称的两点下标和相同(这样也能包含以空位为对称中心的方案),所以设f ...

  2. Mac 开发 Hue

    1)环境准备 Maven 3.6.1 python (Anaconda 2.7.16) MySQL 5.7 git 2.21 2)Hue源码下载 git clone git@github.com:ar ...

  3. 天天坐在电脑面前,小心抑郁!来自一个人的旅行<自导自演>

    画图画累了?写代码写累了?何不放松一下呢. 一望无际.亲近自然.忘乎所以.放空自我! 一个人的旅行, GoPro拍摄,后期采用FCPX.记录梦想, 自导自演.一个人去了很多地方, 认识和很多当地人,交 ...

  4. postman接口测试系列: 时间戳和加密

    在使用postman进行接口测试的时候,对于有些接口字段需要时间戳加密,这个时候我们就遇到2个问题,其一是接口中的时间戳如何得到?其二就是对于现在常用的md5加密操作如何在postman中使用代码实现 ...

  5. SOA架构设计和相关案例分析

    一.SOA概念 1.定义: SOA,是一个组件模型,面向服务的体系架构,它将应用程序的不同服务通过这些服务之间定义良好的接口和契约联系起来,不涉及底层编程接口和通讯模型.服务层是SOA的基础,可以直接 ...

  6. spring @InitBinder

    /** * 将字符串日期转化为Date类型 * @param binder */ @InitBinder protected void initBinder(WebDataBinder binder) ...

  7. htm5 + ajax 文件上传

    好文 http://www.cnblogs.com/morlin/p/4930822.html 后台接收 FormData 的参数一直为空,将jquery改为最高版本,问题解决.测试发现IE10以上才 ...

  8. Web | 解决中文乱码

    设定文件的编码格式在head中添加 <head> <meta http-equiv="Content-Type" content="text/html; ...

  9. python之使用request模块发送post和get请求

    import requestsimport json #发送get请求并得到结果# url = 'http://api.nnzhp.cn/api/user/stu_info?stu_name=小黑马 ...

  10. Hibernate的一级缓存:快照区

    参考来源:http://blog.sina.com.cn/s/blog_981ee5d80102w85f.html