《奔跑吧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. 如何正确访问Redis中的海量数据?服务才不会挂掉!

    一.前言 有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况下Redis里的数据都是海量的,那么我们访问Redis中的海量数据?如何避免事故 ...

  2. dd 使用记录

    使用dd的工具 1)测试写速度 2)测试读速度 3)测试读写速度 dd说明: if是输入文本,of是输出文本,bs是块大小,count是你指定读写块的数量 /dev/zero是从内存里面读取,不会产生 ...

  3. pycharm命令行快捷启动

    打开 本用户目录下的.bashrc文件 vim .bashrc 在末尾添加一行 alias pycharm="the-path-to-pycharm.sh" 最后保存退出 然后更新 ...

  4. python之unittest

    unittest是单元测试的一个框架 在说unittest之前,先说几个概念: TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoade ...

  5. Hdu 3652 B-number (同余数位DP)

    题目链接: Hdu 3652 B-number 题目描述: 给出一个数n,问 [1, n]区间内有几个数能被13整除并且还有13这个子串? 解题思路: 能整除的数位DP,确定好状态随便搞搞就能过了.d ...

  6. Random Query CodeForces - 846F

    题目 翻译: 给出一个n个数字的数列a[1],...,a[n],f(l,r)表示使a[l],a[l+1],...,a[r]组成的新序列中的重复元素只保留一个后,剩下元素的数量(如果l>r,则在计 ...

  7. (转)深入理解Java对象的创建过程

    参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...

  8. 关于c#的结构体struct与class的区别

    C# 结构体 struct C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员. 结构和类的区别: 1.结构是值类型,它在栈中分配空间:而类是引用类型,它在堆中 ...

  9. poj2385 Apple Catching

    思路: 简单dp. 实现: #include <iostream> #include <cstdio> #include <cstring> using names ...

  10. 801硬件检测工具DragonHD的使用

    801硬件检测工具DragonHD的使用 2018/11/28 13:39 版本:V1.0 开发板:SC3817R 1.客户要认证器件,使用了全志官方的工具:DragonHD.exe 打开之后可以见用 ...