暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

磁盘调度算法

原创 BBK 2023-02-22
796

调度算法有:cfq、noop、deadline、Anticipatory

echo参数进去即可生效
#echo 算法 > /sys/block/vda/queue/scheduler

NOOP调度算法

NOOP调度算法也叫电梯调度算法,是将IO请求放入到一个FIFO队列中,然后逐个执行这些请求,当然对于一些磁盘上连续的IO,NOOP算法会适当做出合并,该算法适合那种不希望调度器重新组织IO请求顺序的应用。

这种调度器在以下场景更有优势
1、IO调度器之上的应用程序比IO调度器更懂底层设备,或者说上层的应用程序到达IO调度器之前的IO请求已经做过精心优化,那么IO调度器就不需要再做什么操作,直接转发上层的请求到底层设备即可
2、IO调度器的下方有更加智能的IO调度设备,比如SAN、NAS存储设备,这些设备会更好的组织IO请求,不用IO调度器去做什么额外的操作。
3、对于一些非旋转式的磁头设备使用NOOP的效果更好,例如:SSD盘

cfq算法

cfq算法即:绝对公平算法,意思是先按照输入输出请求的地址进行排序,然后按排好的次序执行请求,这个算法适用于旋转式磁盘,因为寻道会耗费大量时间,因此cfq排好顺序就意味着可以减少磁盘旋转的时间,机械硬盘(SAS、HDD)使用这种算法可以大大提高吞吐量,但是这个算法会导致先输入输出的IO不能先执行,可能会导致IO饿死。

Deadline调度算法

Deadline调度算法是在CFQ算法的基础上,解决了某个IO饿死的情况;
该算法中引入了四个队列,四个队列可以分为两类,每一类都由读和写两队列组成,一列用来对请求按起始扇区序号进行排序—sort_list,另一列对请求按他们的生成时间进行排序—fifo_list.
每当确定了一个传输方向(读/写),那么将从对应的sort_list中将一批连续的请求放到请求队列里,具体的IO数由fifo_batch来确定,只有三种情况才会导致一次批量传输的结束(表示本地读写完成)
1、 对应的sort_list中已经没有请求;
2、 请求队列中没有比现在所读写磁头更大的扇区,即没有更多的请求
3、 上一个请求已经是批量传输的最后一个请求

Anticipatory算法

Anticipatory算法的核心是局部性原理,指的是一个进程做完一次IO请求之后还会继续在此处做IO停留,为每个读IO都设置了6ms的等待时间窗口,如果在这6ms内操作系统收到了相邻位置的读IO请求,就可以立马满足。

增加队列深度的作用?

队列深度决定了给块设备写IO的最大并发数,一次性输入给块设备的IO越多,处理的数据量肯定是最多的,但是过多的IO请求底层的快设备也会处理不过来,所以对于底层若是SAN存储,分布式存储场景可以增加队列深度,本地磁盘的话就不建议修改,默认即可。

预取数量?

预取数量的位置:cat /sys/block/vda/queue/read_ahead_kb
顺序读多的业务,建议加大预取数量

增加IO队列数的作用?
设置的是sys/block/vda/queue/nr_requests这个文件的参数,若将这个参数的值设大,能更多的合并读写操作(整合IO),但是会使读写速度变慢,但是可以读写更多的量,也会使用更多的内存。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论