io-scheduler笔记

【压测模型】

参考这篇,noop结果最优

https://www.cnblogs.com/gjc592/p/13550596.html

 【流程】

1)业务流程

https://www.cnblogs.com/linhaostudy/p/15868785.html

2)内部细节

【cfq思想】

 CFQ算法会为每个进程单独创建一个队列,保存该进程产生的所有IO请求。

不同队列之间按时间片来调度,以此保证每个进程都能很好的分到I/O带宽。这IO的时间片调度跟进程调度是非常相似的,进程调度有进程优先级,而IO调度也有IO优先级

CFQ的出发点是对IO地址进行排序,以尽量少的磁盘旋转次数来满足尽可能多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提高了。但是相比于NOOP的缺点是,先来的IO请求并不一定能被满足,可能会出现饿死的情况

【具体实现】

参考https://blog.xiocs.com/archives/69/

1)submit_bio入口

2)对bio生成request,如果太大分裂

3)插入队列

cfq_insert_request插入两个队列,一个是按照起始扇区号排列的红黑树 (sort_list),一个是按响应期限排列的链表 (fifo)

4)调度派发dispatch

选择哪一个队列的哪一个请求调度?

https://blog.csdn.net/tanzhe2017/article/details/80998174

 

Cfq调度算法旨在保证所用进程的完全公平性,相同的I/O调度周期内,进程被服务的机会是相同的

1)选取红黑树最左节点cfq_queue(每个进程一个)进行服务

当对此队列的服务完成或者分配的时间片耗尽(保证了进程级公平),放在红黑树最右边,

2) Cfq_queue内部的调度,即对一个进程的请求的调度是按照deadline的调度方式

a) 进程新提交的request请求一方面被加入到cfq_queue的按扇区位置排序的sort_list红黑树中

b) 另一方面被加入到按照加入时间排序的fifo链表中

在获取请求提交到传输队列时,先是查看fifo链表中是否有到期的请求,若有则将此请求作为处理的请求对象提交到传输队列,否则从request红黑树上获取一个扇区邻近的请求处理

posted @ 2022-04-10 22:02  stupidstan2019  阅读(152)  评论(0)    收藏  举报