[转帖]Linux中常见IO调度器

linux,常见,io,调度 · 浏览次数 : 0

小编点评

**单队列调度算法 (cfq)** * 基于 Fair Queueing 的调度策略。 * 按进程创建多个队列,试图保持对多个进程的公平。 * 每个队列分配时间片以访问磁盘。 * 如果合并多个请求,就将请求放入队列的最后。 * 每个请求都赋予了一个最大延迟时间,如果达到延迟时间的上限,那么这个请求就会被提前处理掉。 **多队列调度算法 (cfq 和 deadline)** * 基于 Deadline 的调度策略。 * 按进程提交的同步请求放到多个进程队列中。 * 为每个队列分配时间片以访问磁盘。 * 如果多个进程在同一时间请求同一个磁盘地址,就会按照先来后到的顺序进行处理。 * 每个进程都只从自己的队列中获取请求。 * 每个进程都赋予了一个最大延迟时间,如果达到延迟时间的上限,那么这个请求就会被提前处理掉。 **无优先级调度算法 (noop)** * 基于 First-Come-First-Served 的调度策略。 * 只有一个队列,只接收并处理最近到达的请求。 * 每个请求都赋予了一个相同的最大延迟时间。 * 如果请求到达时队列为空,就会被排放到队列的最后。

正文

https://www.jianshu.com/p/3c16e39a005a

 

单队列调度算法多队列调度算法
deadline mqdeadlines
cfq bfq
noop none
  kyber

对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略

  • cfq: 这个名字是Complete Fairness Queueing的缩写,它是一个复杂的调度策略,按进程创建多个队列,试图保持对多个进程的公平(这就没考虑读操作和写操作的不同耗时)
  • deadline: 这个策略比较简单,只分了读和写两个队列(这显然会加速读取量比较大的系统),叫这个名字是内核为每个I/O操作都给出了一个超时时间
  • noop: 这个策略最简单,只有单个队列,只有一些简单合并操作

考虑到硬件配置、实际应用场景(读写比例、顺序还是随机读写)的差异,上面的简单解释对于实际选择没有太大帮助,实际该选择哪个基本还是要实测来验证。不过下面几条说明供参考:

  • 根据多篇文章的说法,deadline和noop差异不是太大,但它们俩与cfq差异就比较大
  • MySQL这类数据存储系统不要使用cfq(时序数据库可能会有所不同。不过也有说从来没见过deadline比cfq差的情况)
  • 对于虚拟机上面的磁盘,建议采用比较简单的noop,毕竟数据实际上怎么落盘取决于虚拟化那一层

Noop调度器算法(SSD)

NOOP全称No Operation,中文名称电梯式调度器,该算法实现了最简单的FIFO队列,所有I/O请求大致按照先来后到的顺序进行操作。NOOP实现了一个简单的FIFO队列,它像电梯的工作方式一样对I/O请求进行组织。它是基于先入先出(FIFO)队列概念的 Linux 内核里最简单的I/O 调度器。此调度程序最适合于固态硬盘。

echo noop > /sys/block/sdb/queue/scheduler

Deadline调度器算法(读优先)

  • Linus Elevator

    在2.4 内核中它是第一种I/O调度器。它的主要作用是为每个设备维护一个查询请求,当内核收到一个新请求时,如果能合并就合并。如果不能合并,就会尝试排序。如果既不能合并,也没有合适的位置插入,就放到请求队列的最后。

Deadline翻译成中文是截止时间调度器,是对Linus Elevator的一种改进,它避免有些请求太长时间不能被处理。另外可以区分对待读操作和写操作。DEADLINE额外分别为读I/O和写I/O提供了FIFO队列。

Deadline对读写request进行了分类管理,并且在调度处理的过程中读请求具有较高优先级。这主要是因为读请求往往是同步操作,对延迟时间比较敏感,而写操作往往是异步操作,可以尽可能的将相邻访问地址的请求进行合并,但是,合并的效率越高,延迟时间会越长。因此,为了区别对待读写请求类型,deadline采用两条链表对读写请求进行分类管理。但是,引入分类管理之后,在读优先的情况下,写请求如果长时间得到不到调度,会出现饿死的情况,因此,deadline算法考虑了写饿死的情况,从而保证在读优先调度的情况下,写请求不会被饿死。

总体来讲,deadline算法对request进行了优先权控制调度,主要表现在如下几个方面:

  1. 读写请求分离,读请求具有高优先调度权,除非写请求即将被饿死的时候,才会去调度处理写请求。这种处理可以保证读请求的延迟时间最小化。

  2. 对请求的顺序批量处理。对那些地址临近的顺序化请求,deadline给予了高优先级处理权。例如一个写请求得到调度后,其临近的request会在紧接着的调度过程中被处理掉。这种顺序批量处理的方法可以最大程度的减少磁盘抖动。

  3. 保证每个请求的延迟时间。每个请求都赋予了一个最大延迟时间,如果达到延迟时间的上限,那么这个请求就会被提前处理掉,此时,会破坏磁盘访问的顺序化特征,回影响性能,但是,保证了每个请求的最大延迟时间。

echo deadline > /sys/block/sdb/queue/scheduler

cfq(读写公平)

CFQ全称Completely Fair Scheduler ,中文名称完全公平调度器,它是现在许多 Linux 发行版的默认调度器,CFQ是内核默认选择的I/O调度器。它将由进程提交的同步请求放到多个进程队列中,然后为每个队列分配时间片以访问磁盘。对于通用的服务器是最好的选择,CFQ均匀地分布对I/O带宽的访问。CFQ为每个进程和线程,单独创建一个队列来管理该进程所产生的请求,以此来保证每个进程都能被很好的分配到I/O带宽,I/O调度器每次执行一个进程的4次请求。该算法的特点是按照I/O请求的地址进行排序,而不是按照先来后到的顺序来进行响应。简单来说就是给所有同步进程分配时间片,然后才排队访问磁盘。

echo cfq > /sys/block/sdb/queue/scheduler 

none (Multiqueue)

多队列无操作I / O调度程序。不对请求进行重新排序,最小的开销。NVME等快速随机I / O设备的理想选择。

mq-deadline(多队列)

这是对最后期限I / O调度程序的改编,但设计用于 多队列设备。一个出色的多面手,CPU开销相当低。

I/O调度器的选择

  • Deadline

    适用于大多数环境,特别是写入较多的文件服务器,从原理上看,DeadLine是一种以提高机械硬盘吞吐量为思考出发点的调度算法,尽量保证在有I/O请求达到最终期限的时候进行调度,非常适合业务比较单一并且I/O压力比较重的业务,比如Web服务器,数据库应用等。

  • CFQ

    为所有进程分配等量的带宽,适用于有大量进程的多用户系统,CFQ是一种比较通用的调度算法,它是一种以进程为出发点考虑的调度算法,保证大家尽量公平,为所有进程分配等量的带宽,适合于桌面多任务及多媒体应用。

  • NOOP

    对于闪存设备和嵌入式系统是最好的选择。对于固态硬盘来说使用NOOP是最好的,DeadLine次之,而CFQ效率最低。

测试磁盘读写

echo noop|cfq|deadline > /sys/block/sda/queue/scheduler

# 测试磁盘读写
time dd if=/dev/sda1 of=/tmp/test bs=2M count=300 conv=fdatasync
# 结果,在读写测试场景下的结果是:
第一,deadline: 用时3.06569s,速度 68.5 MB/s
第二,cfq:用时3.34928s,速度62.7 MB/s
第三,noop:用时3.38164s,速度62.1 MB/s

# 测试磁盘只读操作
time dd if=/dev/sda1 of=/dev/null bs=2M count=300
# 结果,在只读测试场景下的结果是:
第一,noop: 用时1.4871s,速度 141.2 MB/s
第二,deadline:用时1.59658s, 速度131.5 MB/s
第三,cfq:用时1.61414s, 130.1 MB/s

# 测试磁盘写操作
time dd if=/dev/zero of=/tmp/test bs=2M count=300 conv=fdatasync
# 结果,在写测试场景下的结果是:
第一,deadline:用时0.9383s,速度 223.8 MB/s
第二,cfq: 用时1.03042s, 速度203.8 MB/s
第三,noop:用时1.21247s, 速度173.2 MB/s

与[转帖]Linux中常见IO调度器相似的内容:

[转帖]Linux中常见IO调度器

https://www.jianshu.com/p/3c16e39a005a 单队列调度算法多队列调度算法 deadline mqdeadlines cfq bfq noop none kyber 对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是

[转帖]linux块I/O总体概括

直接先上重点,linux中IO栈的完全图如下: 系统中能够随机访问固定大小数据片的硬件设备称作块设备。固定大小的数据片称为块。常见的块设备就是硬盘了。不能随机访问的就是字符设备了,管理块设备比字符设备要复杂很多。 块设备中最小的可寻址单元是扇区,一般是2的整数倍,最常见的是512字节。不过很多CD-

[转帖]Linux磁盘I/O(一):Cache,Buffer和sync

Cache和Buffer的区别 磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。Linux 中“一切皆文件”,我们平时查看的“文件”是普通文件,磁盘是块设备文件,我们可以通过执行 “ls -l <路径>” 查看它们的区别: $ ls

[转帖] Linux文本命令技巧(下)

https://www.cnblogs.com/codelogs/p/16060108.html 简介# 前一篇介绍了Linux中一些基本的文本命令与使用技巧,但是结合场景过少,本篇结合工作中一些常见的场景介绍一些技巧。 数据提取# 数据提取在文本处理中是常见,提取单个值可以使用grep -o功能,

【转帖】Linux查看二进制文件:一招制敌(linux二进制查看文件)

https://www.dbs724.com/146055.html 一招制敌:学会Linux查看二进制文件 在Linux操作系统中,二进制文件是一种常见的文件类型。如果你想深入了解一个二进制文件,可能需要查看其内容。但是,二进制文件是一种机器可读的文件,可能很难直接理解,因此需要特殊的工具来解析和

[转帖]linux内存挂载

1.主要功能 在linux中,为了提高读写速度,可以将内存挂载到目录,常见的文件格式有tmpfs和ramfs。 2.挂载步骤 $ sudo mkdir /mnt/tmp $ sudo mkdir /mnt/ram $ sudo mount -t tmpfs -o size=20m tmpfs /mn

【转帖】eBay 云计算“网”事|网络重传篇

https://www.infoq.cn/article/iy1drmf6wk8up14dchq8/ #导读 在之前的eBay云计算“网”事|网络超时篇和eBay云计算“网”事|网络丢包篇里,我们针对 Linux 主机网络中常见的延时和丢包问题进行了分析。本篇将关注网络中另外一个常见的问题: 重传

[转帖]在Linux上施加高CPU负载和压力测试,牛皮!

https://cloud.tencent.com/developer/article/2048995 在日常工作中,CPU压力测试是一项常见的工作,主要用到如下场景: 微调系统上的活动。 监控操作系统内核接口。 测试您的Linux硬件组件,例如CPU、内存、磁盘设备和许多其他组件,以观察它们在压力

[转帖]linux查询bash行,Linux入门11-bash常见特性及文本查看命令

https://blog.csdn.net/weixin_30847063/article/details/117008175 Linux的基本命令都存放在/bin中,里面是命令的二进制文件。下面对常用命令进行讲解。 du :查看文件或者目录的大小。常用格式:du -h 文件名/目录。常用选项-h:

【转帖】Linux性能优化(十六)——中断绑定

一、中断绑定简介 1、中断简介 计算机中,中断是一种电信号,由硬件产生并直接送到中断控制器上,再由中断控制器向CPU发送中断信号,CPU检测到信号后,中断当前工作转而处理中断信号。CPU会通知操作系统已经产生中断,操作系统就会对中断进行处理。常见的中断控制器有两种:可编程中断控制器8259A和高级可