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. python的**和*

    1.**两个乘号就是乘方,比如2**4,结果就是2的4次方,结果是16一个乘号*,如果操作数是两个数字,就是这两个数字相乘,如2*4,结果为8*如果是字符串.列表.元组与一个整数N相乘,返回一个其所有 ...

  2. 重新认识下数组的concat方法

    最近在学习react,看官方文档的时候,有一个例子中的一句话让我困惑.就是讲todoList的例子 concat不是连接数组的吗?看了一下concat的介绍 数组虽然是对象类型,但是对象毕竟不是数组啊 ...

  3. 多任务版udp聊天器

    import socket import threading def send_msg(udp_socket): """获取键盘数据,并将其发送给对方"&quo ...

  4. Percona-Tookit工具包之pt-sift

      Preface       We've got a lot of files related with system performance which generated by pt-stalk ...

  5. js将人民币数字转大写

    function numberToUpper(money) { var cnNums = new Array("零", "壹", "贰", ...

  6. Mysql_Binary_Install_Scripts(采用二进制方式安装)

    1.1    MYSQL实现代码 #!/bin/bash ######################################## #auth:wolf_dreams #time:2018-1 ...

  7. JZOJ 5914. 盟主的忧虑

    Description     江湖由 N 个门派(2≤N≤100,000,编号从 1 到 N)组成,这些门派之间有 N-1 条小道将他们连接起来,每条道路都以“尺”为单位去计量,武林盟主发现任何两个 ...

  8. Social Media Addiction【社交媒体上瘾】

    Social Media Addiction Children as young as ten are becoming dependent on social media for their sen ...

  9. B1076 Wifi密码 (15分)

    B1076 Wifi密码 (15分) 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B ...

  10. [Bzoj1037][ZJOI2008]生日聚会(DP)

    Description 题目链接 Solution 这题状态比较难想, \(dp[i][j][g][h]\)表示强i个人有j个男生,在某个区间男生最多比女生多g人,女生最多比男生多h人的方案数,然后D ...