cfq调度器
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调度器的更多相关文章
- Linux IO Scheduler(Linux IO 调度器)
每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...
- Linux IO 调度器
Linux IO Scheduler(Linux IO 调度器) 每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交 ...
- Linux IO Scheduler(Linux IO 调度器)【转】
每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...
- 转: 调整 Linux I/O 调度器优化系统性能
转自:https://www.ibm.com/developerworks/cn/linux/l-lo-io-scheduler-optimize-performance/index.html 调整 ...
- Linux I/O 调度器
每个块设备或者块设备的分区,都对应有自身的请求队列, 而每个请求队列都可以选择一个I/O调度器来协调所递交的.I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动, ...
- 编写简单的ramdisk(选择IO调度器)
前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...
- Linux IO调度器相关算法介绍(转)
IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...
- IO调度器原理介绍
IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...
- 大数据之Yarn——Capacity调度器概念以及配置
试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...
随机推荐
- jQuery 二级联动
jQuery 二级联动 ----请选择省份---- 北京 上海 江苏 ----请选择城市---- 东城 西城 崇文 宣武 朝阳 黄浦 卢湾 徐汇 长宁 静安 南京 镇江 苏州 南通 扬州 & ...
- js动画效果
js能够按照预定的时间间隔重复调用一个函数,而这意味着我们可以随着时间的推移而不断改变某个元素的样式.动画是样式随时间变化的完美例子之一. js函数setTimeout能够让某个函数在经过一段预定的时 ...
- redis 过期回调通知
redis 过期回调通知 背景 在使用redis的过程中,有时我们会遇到这种情景,当key过期的时候,我们需要去重新做一些操作,比如重新生成value等.之前,一直用的是添加一个celery定时任务, ...
- 【例题收藏】◇例题·III◇ 木と整数 / Integers on a Tree
◇例题·III◇ 木と整数 / Integers on a Tree 只需要一个美妙的转换,这道题就会变得无比美妙…… 来源:+AtCoder 2148(ARC-063 E)+ ◆ 题目大意 给定一棵 ...
- spring boot+log4j2快速使用(一)
log4j是Apache的一个开源项目,log4j2和log4j是一个作者,只不过log4j2是重新架构的一款日志组件,他抛弃了之前log4j的不足,以及吸取了优秀的logback的设计重新推出的一款 ...
- strak组件(6):列表定制列应用和引入静态文件
效果图: 新增函数 def get_choice_text(title, field) 闭包函数,显示choice字段 def inner(self, obj=None, is_header=None ...
- 使用python制作神经网络——搭建框架
一.神经网络的大体结构可分为三个函数,分别如下: 1.初始化函数 设定输入层节点,隐藏层节点和输出层节点的数量. 2.训练 学习给定训练集样本后,优化权重. 3.查询 给定输入,从输出节点给出答案 所 ...
- POJ:3320-Jessica's Reading Problem(尺取法)
Jessica's Reading Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15224 Accepted: ...
- CSS3---混合模式
概念 CSS3混合模式( CSS Blend Modes )是CSS3新增的一个魔法特性,可以允许多个背景或多个元素进行混合,类似于Photoshop的图层混合模式 CSS3混合模式属性一览 ba ...
- 关于Python、Java、C#语言的一些比较
不能说某某语言不好! 首先,千万别说某一个语言好不好,应为这样的用词是错的,我曾经在好多场合听到一些程序员说java好,.net不好这类的话. 其实语言不分好坏,只是在具体的某些领域或业务场景上不合适 ...