[转帖]Linux 磁盘I/O 调度算法 说明

linux,磁盘,调度,算法,说明 · 浏览次数 : 0

小编点评

**I/O 调度方法** I/O 调度方法是处理多个 I/O 请求的算法。在内核中,有多种 I/O 调度方法可用于处理 I/O 请求,包括 CFQ、NOOP、Deadline 和 AS。 **CFQ(完全公平排队 I/O 调度算法)** CFQ 是 Linux 4.0 中推荐的默认 I/O 调度算法。它基于进程优先级,为每个进程创建一个队列,并按请求的优先级进行调度。CFQ 试图均匀地分布对 I/O 带宽的访问,避免进程被饿死并实现较低的延迟。 **NOOP(电梯式调度程序)** NOOP 是另一种流行的 I/O 调度算法,适用于 SSD 和嵌入式系统。它使用 FIFO队列进行处理,并按请求创建时间排序,以实现效率最高。 **Deadline(截止时间调度程序)** Deadline 是一种以提高机械硬盘吞吐量为目标的 I/O 调度算法。它确保在最终期限内服务请求,并通过创建多个队列来实现该目标。Deadline 最佳适用于单一业务场景,其中 IO 密集在特定时间内。 **AS(预料 I/O 调度程序)** AS 是一种更复杂的 I/O 调度算法,它会在最后一次读操作后等待 6 ms,才能继续进行对其他 I/O 请求进行调度。它适用于写入较多的环境,如文件服务器。 ** I/O 调度方法的查看与设置** * 查看当前系统的 I/O 调度方法:`cat /sys/block/sda/queue/schedulernoop anticipatory deadline cfq` * 临地更改 I/O 调度方法:例如,要更改到 `noop` 算法:`echo noop > /sys/block/sda/queue/scheduler` * 永久设置 I/O 调度方法:修改内核引导参数,加入 `elevator=调度程序名` 参数:`kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet重启之后,查看调度方法:`vi cat /sys/block/sda/queue/schedulernoop anticipatory [deadline] cfq`

正文

 

2022-08-23 13:031361转载Linux

1 Linux 4.0 IO协议栈框架图

I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。

Linux 4.0 IO协议栈框架图

I/O调度程序的总结

  1. 当向设备写入数据块或是从设备读出数据块时,请求都被安置在一个队列中等待完成.
  2. 每个块设备都有它自己的队列.
  3. I/O调度程序负责维护这些队列的顺序,以更有效地利用介质.I/O调度程序将无序的I/O操作变为有序的I/O操作.
  4. 内核必须首先确定队列中一共有多少个请求,然后才开始进行调度.

2 I/O调度的4种算法:

2.1 CFQ(完全公平排队I/O调度程序) — 默认

在最新的内核版本和发行版中,都选择CFQ做为默认的I/O调度器,对于通用的服务器也是最好的选择。CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择。CFQ赋予I/O请求一个优先级,而I/O优先级请求独立于进程优先级,高优先级的进程的读写不能自动地继承高的I/O优先级。
对于很多IO压力较大的场景就并不是很适应,尤其是IO压力集中在某些进程上的场景。因为这种场景我们需要更多的满足某个或者某几个进程的IO响应速度,而不是让所有的进程公平的使用IO,比如数据库应用。

CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,是deadline和as调度器的折中.

工作原理:
CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,每个队列按照上述规则进行merge和sort。各队列之间的调度使用时间片来调度,以此来保证每个进程都能被很好的分配到I/O带宽.I/O调度器每次执行一个进程的4次请求。可以调 queued 和 quantum 来优化

2.2 NOOP(电梯式调度程序) — SSD 推荐

在Linux2.4或更早的版本的调度程序,那时只有这一种I/O调度算法.I/O请求被分配到队列,调度由硬件进行,只有当CPU时钟频率比较有限时进行。

 

Noop对于I/O不那么操心,对所有的I/O请求都用FIFO队列形式处理,默认认为 I/O不会存在性能问题。这也使得CPU也不用那么操心。它像电梯的工作主法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质.

NOOP倾向饿死读而利于写.
NOOP对于闪存设备,RAM,嵌入式系统是最好的选择.

 

电梯算法饿死读请求的解释:
因为写请求比读请求更容易.
写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到I/O队列中.
读请求需要等到它前面所有的读操作完成,才能进行下一次读操作.在读操作之间有几毫秒时间,而写请求在这之间就到来,饿死了后面的读请求.

2.3 Deadline(截止时间调度程序) — 数据库推荐

通过时间以及硬盘区域进行分类,这个分类和合并要求类似于noop的调度程序.
Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象.

Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择。

deadline实现了四个队列,其中两个分别处理正常read和write,按扇区号排序,进行正常io的合并处理以提高吞吐量.因为IO请求可能会集中在某些磁盘位置,这样会导致新来的请求一直被合并,于是可能会有其他磁盘位置的io请求被饿死。于是实现了另外两个处理超时read和write的队列,按请求创建时间排序,如果有超时的请求出现,就放进这两个队列,调度算法保证超时(达到最终期限时间)的队列中的请求会优先被处理,防止请求被饿死。由于deadline的特点,无疑在这里无法区分进程,也就不能实现针对进程的io资源控制。

2.4 AS(预料I/O调度程序)

本质上与Deadline一样,但在最后一次读操作后,要等待6ms,才能继续进行对其它I/O请求进行调度.可以从应用程序中预订一个新的读请求,改进读操作的执行,但以一些写操作为代价.它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.

AS适合于写入较多的环境,比如文件服务器
AS对数据库环境表现很差.

从原理上看:
1、cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的调度算法,保证大家尽量公平。
2、deadline是一种以提高机械硬盘吞吐量为思考出发点的调度算法,只有当有io请求达到最终期限的时候才进行调度,非常适合业务比较单一并且IO压力比较重的业务,比如数据库。
3、noop?思考对象如果拓展到固态硬盘,那么你就会发现,无论cfq还是deadline,都是针对机械硬盘的结构进行的队列算法调整,而这种调整对于固态硬盘来说,完全没有意义。对于固态硬盘来说,IO调度算法越复杂,效率就越低,因为额外要处理的逻辑越多。所以,固态硬盘这种场景下,使用noop是最好的,deadline次之,而cfq由于复杂度的原因,无疑效率最低。

 

3 I/O调度方法的查看与设置

1. 查看当前系统的I/O调度方法:

[root@cndba ~]# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
[root@cndba ~]#

2. 临地更改I/O调度方法:

例如:想更改到noop电梯调度算法:

[root@cndba ~]# echo noop > /sys/block/sda/queue/scheduler
[root@cndba ~]# cat /sys/block/sda/queue/scheduler
[noop] anticipatory deadline cfq
[root@cndba ~]#

3. 想永久的更改I/O调度方法:

修改内核引导参数,加入elevator=调度程序名

[root@cndba ~]# vi  /boot/grub/menu.lst
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

重启之后,查看调度方法:

[root@cndba ~]# vi  cat /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq

已经是deadline了

与[转帖]Linux 磁盘I/O 调度算法 说明相似的内容:

[转帖]Linux 磁盘I/O 调度算法 说明

2022-08-23 13:031361转载Linux 1 Linux 4.0 IO协议栈框架图 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 Linux 4.0 IO协议栈框架图 I/O调度程序的总结 当向

[转帖]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队列调度策略

https://zhuanlan.zhihu.com/p/450329513 傻瓜化说明 简单地说,对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是Complete Fairness Queueing的缩写,它是一个复杂的调度策略,按进程创建多个

[转帖]Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能

文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。 当然,也存在缓存被写爆的

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

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

[转帖]如何监测 Linux 的磁盘 I/O 性能

https://bbs.huaweicloud.com/blogs/379242 在我之前的文章:《探讨 Linux 的磁盘 I/O》中,我谈到了 Linux 磁盘 I/O 的工作原理,我们了解到 Linux 存储系统 I/O 栈由文件系统层(file system layer)、通用块层( gen

[转帖]Linux 性能优化和内核观测 - 文件系统与磁盘I/O篇(一)

文件系统索引节点和目录项为了方便管理,Linux 文件系统为每个文件都分配了两个数据结构,即​​索引节点(index node)​​​和​​目录项(directory entry)​​。它们主要用来记录文件的元信息和目录结构。索引节点(简称 inode):用于记录文件的元数据,比如 inode 编号

[转帖]Linux使用Stress-ng测试CPU、内存、磁盘I/O满载情况教程与范例

https://www.xiaoyuanjiu.com/108301.html 介绍如何在 Linux 系统上使用 stress-ng 负载测试工具,产生 CPU、内存等资源满载的状况。 stress-ng stress-ng 与旧的 stress 都可以用来产生系统负载,但新的 stress-ng

[转帖] Linux命令拾遗-使用blktrace分析io情况

https://www.cnblogs.com/codelogs/p/16060775.html 简介# 一般来说,想检查磁盘I/O情况,可以使用iostat、iotop、sar等,但这些命令只能做一个整体的了解,没法具体到某一次io的详细情况,而今天介绍的blktrace就可以深入到Linux I

[转帖] Linux命令拾遗-使用blktrace分析io情况

https://www.cnblogs.com/codelogs/p/16060775.html 简介# 一般来说,想检查磁盘I/O情况,可以使用iostat、iotop、sar等,但这些命令只能做一个整体的了解,没法具体到某一次io的详细情况,而今天介绍的blktrace就可以深入到Linux I