cfq调度是block层最复杂的一个调度器,主要思想是是说每个进程平均享用IO带宽,实现方法是在时间上对进程进行划分,以此达到平均占用IO的目的。带着几个问题去看cfq

1)现在进程来了之后,是插入到某一个队列中去,或者说是进程的IO插入到其中;

2)上面提到的队列是啥子咧?是一个接收BIO的队列?还是一个进程的队列,io_context是啥子?

【电梯中函数的执行的顺序是啥样子的?很重要!】

elv_set_request
#0  elv_set_request (q=0xffff88007c21aa08, rq=0xffff88007c127590, bio=0xffff88007c892000, gfp_mask=37748736) at block/elevator.c:718
#1 0xffffffff81353f00 in __get_request (gfp_mask=<optimized out>, bio=<optimized out>, op_flags=<optimized out>, op=<optimized out>,
rl=<optimized out>) at block/blk-core.c:1172
#2 get_request (q=<optimized out>, op=<optimized out>, op_flags=<optimized out>, bio=0xffff88007c892000, gfp_mask=<optimized out>)
at block/blk-core.c:1265
#3 0xffffffff813564ae in blk_queue_bio (q=0xffff88007c21aa08, bio=0xffff88007c892000) at block/blk-core.c:1762
#4 0xffffffff81354900 in generic_make_request (bio=0xffff88007c892000) at block/blk-core.c:2062
#5 0xffffffff81354a1e in submit_bio (bio=0xffff88007c21aa08) at block/blk-core.c:2122
#6 0xffffffff811b35e4 in submit_bh_wbc (op=<optimized out>, op_flags=2081584528, bh=0xffff88007c892000, bio_flags=37748736,
wbc=<optimized out>) at fs/buffer.c:3101
#7 0xffffffff811b3770 in __block_write_full_page (inode=<optimized out>, page=0xffffea00000821c0, get_block=<optimized out>,
wbc=<optimized out>, handler=<optimized out>) at fs/buffer.c:1789
#8 0xffffffff811b3c08 in block_write_full_page (page=0xffffea00000821c0, get_block=0xffffffff811b5c90 <blkdev_get_block>,
wbc=<optimized out>) at fs/buffer.c:2977
#9 0xffffffff811b66d8 in blkdev_writepage (page=<optimized out>, wbc=<optimized out>) at fs/block_dev.c:313

  cfq中有优先级树,所有的优先级

  对于一个磁盘所有的IO,都是放在一棵优先级数里边管理的(即便这些IO来自于不同的进程)

各种tree之间是什么关系,首先,一个进程在每个设备上都有自己的cfq_queue,这个queue里面装这这个进程所有的IO,那么这些IO是怎么整的呢?

每个设备都有自己的cfq_data,在这个结构中,是如何管理进程的这些东西咧

request在哪里管理呢?request在cfq_queue中管理(elv_rb_add 函数)

cfq_resort_rr_list

上面这个函数中把cfqq加入到cfqd中去,分别加入到:service_tree_add 和 cfq_prio_tree_add,这俩是干嘛的呀

到底要插入到哪一棵service tree啊,

所以我们知道了一件事情,所有的cgroup都是通过key=vdisktime插入到该disk全局红黑树中;

每个cgroup中有一颗服务树二维数组[2][3],这棵树里面,每一进程cfq-queue,就插入到这棵服务树里的一棵,其中键值好像是服务的起始时间;

另外cfqd中还维护着一条对于所有IO的优先级树。。。。

现在,一个进程的IO就放在这里了,在各种树里管理着

大致清楚了选择进程的过程,首先会选择cgroup组,然后会从cgroup组中按照优先级选择一个IO下发。

算是比较清楚了吧,现在,oh,my gosh,这个周不是人过的

明天再想一个问题,一个cgroup组里的进程是怎么共享带宽的咧?

cfq调度器的更多相关文章

  1. Linux IO Scheduler(Linux IO 调度器)

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  2. Linux IO 调度器

    Linux IO Scheduler(Linux IO 调度器) 每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交 ...

  3. Linux IO Scheduler(Linux IO 调度器)【转】

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  4. 转: 调整 Linux I/O 调度器优化系统性能

    转自:https://www.ibm.com/developerworks/cn/linux/l-lo-io-scheduler-optimize-performance/index.html 调整 ...

  5. Linux I/O 调度器

    每个块设备或者块设备的分区,都对应有自身的请求队列,  而每个请求队列都可以选择一个I/O调度器来协调所递交的.I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动, ...

  6. 编写简单的ramdisk(选择IO调度器)

    前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...

  7. Linux IO调度器相关算法介绍(转)

    IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...

  8. IO调度器原理介绍

    IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...

  9. 大数据之Yarn——Capacity调度器概念以及配置

    试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...

随机推荐

  1. JavaScript_DOM学习篇_图片切换小案例

    今天开始学习DOM操作,下面写一个小案例来巩固下知识点. DOM: document object model (文档对象模型) 根据id获取页面元素 : 如: var xx = document.g ...

  2. MappingException:class com.zsn.crm.Model.user not found whie looking for property user id

    之前好好地运行 什么东西都没动过 再次运行突然报异常*****MappingException:class com.zsn.crm.Model.user not found whie looking ...

  3. 读键值对封装成Map

    描述: 有配置文件address_relation.properties,记录地址关系,有如下数据:ZSSS=ZS%,ZSPD, 封装到Map代码如下: public static void main ...

  4. python中正则表达式在中文字符串匹配时的坑

    之前一直有使用python 正则表达式来做中文字符串或者中英文数字混合的字符串的匹配,发现有不少情况下会匹配失灵或者结果混乱,并且在不同操作系统上匹配结果也不一致,查了很久都不知道是什么原因.今天终于 ...

  5. HTML+CSS : 笔记整理(3 移动端布局简单了解)

    流体布局:宽度用百分比,计算真实宽度用函数 : width: calc(25% - 4px); box-sizing: 1.content-box:默认计算方式 ,宽度和高度分别应用到元素的内容框.在 ...

  6. 为什么 redis 单线程却能支撑高并发

    redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? 这个是问 redis 的时候,最基本的问题吧,redis 最基本的一个内部原理 ...

  7. java中substring()、charAt()、indexOf() (2013-05-05-bd 写的日志迁移

    substring 1. public String substring(int beginIndex)     返回一个新的字符串,它是此字符串的一个子字符串, 该子字符串始于指定索引处的字符,一直 ...

  8. Linux编译移植Qt5的环境_Xillinx的ZYNQ平台

    Linux编译Qt环境 2017年的十一假期,足不出户,一个人在教研室里面搞Qt的移植.我手里面有Samsung的CortexA8,Samsung的 CortexA53还有Ti的Sitara系列的AM ...

  9. B1016 部分A+B (15分)

    B1016 部分A+B (15分) 输入格式: 输入在一行中依次给出 A.DA.B.DB,中间以空格分隔,其中 \(0<A,B<10^10\). 输出格式: 在一行中输出 PA+PB的值. ...

  10. PHP.24-TP框架商城应用实例-后台1-添加商品功能、钩子函数、在线编辑器、过滤XSS、上传图片并生成缩略图

    添加商品功能 1.创建商品控制器[C] /www.test.com/shop/Admin/Controller/GoodsController.class.php <?php namespace ...