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项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...
随机推荐
- python基本使用时常见错误
python基本使用时常见错误 字符编码错误 如果要学习计算机编程语言,首先就要搞懂字符编码,否则在以后的学习过程中,将会是一场噩梦.在一开始使用的时候,我就遇到了很多的关于字符编码的问题,做个简单的 ...
- OCCI的迭代修改
传统的在执行多行DML(INSERT.UPDATE.DELETE)时,我们是多次调用executeUpdate():注意!当我们调用一次此函数时,则执行一次网络往返,当数据量大时则效率非常低.不过 O ...
- JS - CommonJS、AMD、CMD
CommonJS CommonJS是一种JS模块定义规范,它出现之初是为了解决JS天生没有模块管理的缺陷,它的终极目标是提供一个类似Python.Ruby和Java标准库.NodeJS的模块系统就是参 ...
- request中的那些方法到底是干什么的?
最近做Java Web项目,在.jsp页面和servlet之间request和response还是有些混淆,查阅了一些资料,总结如下,方便以后使用: 首先,servlet接口是最基本的,提供的五个方法 ...
- [CQOI2007]余数求和 (分块+数学
题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 ...
- python——标准异常总结
请参考此网站: Python 标准异常总结 https://fishc.com.cn/forum.php?mod=viewthread&tid=45814&extra=page%3D1 ...
- POJ:1222-EXTENDED LIGHTS OUT(矩阵反转)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12956 Accepted: 8186 ...
- 笔记-python-语法-super
笔记-python-语法-super 1. super 1.1. super起源 首先要理解类的继承和多继承,子类有时需要调用父类的方法, 非绑定方法: class C(B): def ...
- hive-pom.xml
4.0.0 <groupId>com.cenzhongman</groupId> <artifactId>hive</artifactId> <v ...
- Java线程和多线程(五)——单例类中的线程安全
单例模式是最广泛使用的创建模式之一.在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁.为了达到这个目的,开发者 ...