[转帖]linux下 进程io队列,IO队列和IO调度

linux,进程,io,队列,调度 · 浏览次数 : 0

小编点评

**IO调度和IO队列的定位** IO调度和IO队列位于整个IO体系的**调度层**。 **IO调度器**负责将无序的IO操作转换为大致有序的IO请求,并根据IO请求的优先级调度相应的IO请求。 **IO队列**是一个用于存储和调度IO请求的队列,每个IO队列对应一个块设备。 **IO调度算法的意义** 1. **提高IO吞吐量:**通过调整IO请求的顺序,IO调度器可以优化IO请求的处理顺序,提高IO吞吐量。 2. **降低IO响应时间:**IO调度器可以根据IO请求的优先级,选择最适合的IO调度算法,降低IO响应时间。 **IO队列的深度** IO队列深度是指IO队列的最大深度,表示IO队列中能够存储的最大IO请求数量。 **如何计算IO队列深度?** IO队列深度等于块设备的物理内存大小。

正文

IO体系概览

先看看本文主题IO调度和IO队列处于整个IO体系的哪个位置,这个IO体系是非常重要的,了解IO体系我们可以对整个IO过程有个全面的认识。虽然一下两下并不清楚IO体系各个部分的细节,但是我们总是能从这儿找到脉络。知道什么问题在什么位置,这个是解决问题的时候最关键的。任何所谓的专家都不太可能100%的了解全部细节,但是知道脉络,可以针对问题有的放矢。

实际上也不用完全明白,没有必要:):)

接下来咱们还是继续主题,请看下图

(注意:本图不涉及direct I/O)

ad3be2f98c9d85f9669b3136da715f6e.png

图中数据流箭头1,2如果不了解请参照拙文《IO之标准C库buffer》。

IO调度和IO队列

1.向块设备写入数据块或是从块设备读出数据块时,IO请求要先进入IO队列,等待调度。

2.这个IO队列和调度的目标是针对某个块设备而言的,换句话说就是每个块设备都有一个独立的IO队列。

3.本篇所涉及的所谓的块设备就是iostat命令里面列出的形如sda,sdb这样的块设备,并不是指物理磁盘。假如一个盘被分成5个分区,那么在这个主题下,5个分区代表5个块设备,每个块设备都有自己独立的IO队列。

4.I/O 调度程序维护这些队列,以便更有效地利用外存设备。简单来说,IO调度程序将无序的IO操作变为大致有序的IO请求。比如调度的时候调整几个IO请求的顺序,合并那些写盘区域相邻的请求,或者按照写磁盘的位置排序这些请求,以降低磁头在磁盘上来回seek的操作,继而加速IO。

5.每个队列的每一次调度都会把整个队列过一遍,类似于进程调度的时候每次调度都要计算RUN队列的全部进程的优先级。

IO队列深度

这个参数是iostat里面呈现的,字面意思显而易见,就是IO队列的深度,这个参数有何意义呢?

针对每个机械物理盘,如果这个盘对应的IO队列深度超过3,那么基本上表示这个盘处理IO硬件请求有点吃紧,这个盘对应的IO队列深度怎么算呢?

还拿上面一个盘被切成5个分区说事儿,5个分区对应5个块设备,5个块设备对应5个IO队列,这5个IO队列的深度总和就是这个机械物理盘的IO队列深度了。

如何解决这个盘的IO请求吃紧呢,最简单的办法硬件加速,把这个盘换成SSD盘:)

说到这儿,我想提一提RAID卡。咱们使用RAID卡把几个硬盘放在一起,让系统只能看见一个块设备。这个时候,假如有4个盘被放在RAID后面。那么这个RAID卡对应的块设备的IO队列深度允许超过12(4个磁盘,每个盘承受深度为3)。

SSD盘可承受的IO队列深度值很大,这个多少深度合适,我没有注意具体观察过。

iostat另一个参数----"%util"

实际生产系统上,我观察IO设备是否吃紧,其实是看这个util的。这个值长期高于60,咱们就得考虑物理磁盘IO吃不消了。

如果是使用机械硬盘的服务器上这个值达到90以上,最简单的解决方案仍然是换SSD盘,换完之后这个值会下降到20左右,非常有效。

IO调度算法

IO调度算法存在的意义有两个:一是提高IO吞吐量,二是降低IO响应时间。然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平衡这两者,IO调度器提供了多种调度算法来适应不同的IO请求场景。

以下几个算法介绍是网上抄来的,说的很详细,作者水平很高:)

1、NOOP

该算法实现了最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。之所以说"大致",原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求。

假设有如下的io请求序列:

100,500,101,10,56,1000

NOOP将会按照如下顺序满足:

100(101),500,10,56,1000

2、CFQ

CFQ算法的全写为Completely Fair Queuing。该算法的特点是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。

假设有如下的io请求序列:

100,500,101,10,56,1000

CFQ将会按照如下顺序满足:

100,101,500,1000,10,56

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

3、DEADLINE

DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示如下:

FIFO(Read) > FIFO(Write) > CFQ

这个算法特别适合数据库这种随机读写的场景。

4、ANTICIPATORY

CFQ和DEADLINE考虑的焦点在于满足离散IO请求上。对于连续的IO请求,比如顺序读,并没有做优化。为了满足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每个读IO都设置了6ms的等待时间窗口。如果在这6ms内OS收到了相邻位置的读IO请求,就可以立即满足。

IO调度器算法的选择,既取决于硬件特征,也取决于应用场景。

在传统的SAS盘上,CFQ、DEADLINE、ANTICIPATORY都是不错的选择;对于专属的数据库服务器,DEADLINE的吞吐量和响应时间都表现良好。然而在新兴的固态硬盘比如SSD、Fusion IO上,最简单的NOOP反而可能是最好的算法,因为其他三个算法的优化是基于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且IO响应时间非常短。

IO调度算法的查看和设置

查看和修改IO调度器的算法非常简单。假设我们要对sda进行操作,如下所示:

cat /sys/block/sda/queue/scheduler

echo 'cfq' >/sys/block/sda/queue/scheduler

还有持久化设置,不一一列举了。

调整IO优先级----ionice

这个我本人没用过,但是看起来很诱人:)

IO性能测试

工具有fio,iometre和简单实用的dd

如何系统化的测试和观察RAID卡,SSD,SAS这样的存储介质。后续我会在专门的硬件加速方面介绍。

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux28818 人正在系统学习中

与[转帖]linux下 进程io队列,IO队列和IO调度相似的内容:

[转帖]linux下 进程io队列,IO队列和IO调度

IO体系概览 先看看本文主题IO调度和IO队列处于整个IO体系的哪个位置,这个IO体系是非常重要的,了解IO体系我们可以对整个IO过程有个全面的认识。虽然一下两下并不清楚IO体系各个部分的细节,但是我们总是能从这儿找到脉络。知道什么问题在什么位置,这个是解决问题的时候最关键的。任何所谓的专家都不太可

[转帖]小技巧!如何用 systemtap 排查问题

https://www.modb.pro/db/79444 霸爷博客,干货满满。有两篇文章现在还记得,《Linux下如何知道文件被哪个进程写》[1]和《巧用Systemtap注入延迟模拟IO设备抖动》[2],周末突然想起来,发现能看懂了:) 本文虽然说是小技巧,可是难度一点也不低 ^_^ 什么是 s

[转帖]Systemtap 用法

https://www.jianshu.com/p/fb4dde8baff4 霸爷博客,干货满满。有两篇文章现在还记得,《Linux下如何知道文件被哪个进程写》和《巧用Systemtap注入延迟模拟IO设备抖动》,周末突然想起来,发现能看懂了:) 什么是 systemtap Systemtap is

[转帖]【学习笔记】Linux下CPU性能评估

Linux下CPU性能评估 1、 vmstat监控CPU使用情况 【说明】 procs: l r表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU的个数,就说明CPU不足,需要增加CPU。 l b表示在等待资源的进程数,比如正在等待I/O或者内存交换等。 memory: l swpd:

[转帖]Linux下进程管理知识(详细)总结

一、简介 本文主要详细介绍进程相关的命令的使用、进程管理及调度策略的知识。 二、常用的命令解析 1、ps命令 命令选项解析-a显示一个终端所有的进程-u显示进程的归属用户和内存占用情况-x显示没有控制终端的进程-l长格式显示更详细的信息-e显示所有进程-w宽行显示,可以使用多个w进行加宽显示 进程常

[转帖]Linux系统:page fault

Linux进程如何访问内存 Linux下,进程并不是直接访问物理内存,而是通过内存管理单元(MMU)来访问内存资源,原因后面会讲到。 为什么需要虚拟内存地址空间 假设某个进程需要4MB的空间,内存假设是1MB的,如果进程直接使用物理地址,这个进程会因为内存不足跑不起来。既然进程不是直接访问物理内存,

[转帖]Linux下 查看 每个进程占用的网络带宽 - NetHogs

https://www.cnblogs.com/xuyaowen/p/NetHogs.html 今天在服务器上进行测试程序,发现网速占用比较大,但不是我的程序。可能是其他同学在下载或者上传数据,所以需要看到底是哪个进程。 这时候使用 iftop, vnstat 等命令不能看出具体是哪个进程占用,因为

[转帖]Linux下strace调试系统应用参数总结(附实例操作讲解)

文章目录 一、简介二、常用参数详解三、实例详解3.1 跟踪具体进程3.2 监控具体程序执行过程 四、其他相关知识链接 一、简介 strace命令是一个集诊断、调试、统计与一体的Linux 用户空间跟踪器,我们可以使用strace对应用的系统调用、信号传递和进程状态变更的监控结果来对应用进行分析,以达

[转帖]Linux下strace调试系统应用参数总结(附实例操作讲解)

文章目录 一、简介二、常用参数详解三、实例详解3.1 跟踪具体进程3.2 监控具体程序执行过程 四、其他相关知识链接 一、简介 strace命令是一个集诊断、调试、统计与一体的Linux 用户空间跟踪器,我们可以使用strace对应用的系统调用、信号传递和进程状态变更的监控结果来对应用进行分析,以达

[转帖]Linux性能优化(十五)——CPU绑定

一、孤立CPU 1、孤立CPU简介 针对CPU密集型的任务,CPU负载较高,推荐设置CPU Affinity,以提高任务执行效率,避免CPU进行上下文切换,提高CPU Cache命中率。 默认情况下,Linux内核调度器可以使用任意CPU核心,如果特定任务(进程/线程)需要独占一个CPU核心并且不想