在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

Linux块设备中的IO路径及调度策略是什么

152次阅读
没有评论

共计 2315 个字符,预计需要花费 6 分钟才能阅读完成。

这篇“Linux 块设备中的 IO 路径及调度策略是什么”文章的知识点大部分人都不太理解,所以丸趣 TV 小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux 块设备中的 IO 路径及调度策略是什么”文章吧。

当文件系统通过 submit_bio 提交 IO 之后,请求就进入了通用块层。通用块层会对 IO 进行一些预处理的动作,其目的是为了保证请求能够更加合理的发送到底层的磁盘设备,尽量保证性能。这里面比较重要的就是 IO 调度模块。大家可能都听说过 CFQ,除此之前还有 DeadLine 和 Noop 等,这些都是磁盘的调度算法。其中 CFQ 调度算法用的最多。

如果忽略块设备的层叠结构和各种映射,简化的结构大概有 3 层,如图 1 所示。这里的 3 层并非都是软件,还包含硬件。通用块层就不用多说了,这里主要完成 IO 的合并和调度等操作。其下是驱动层,驱动层是硬件的驱动程序,用于将 IO 请求转换为对硬件寄存器的操作(注:不同的块设备又有差异,必然 iSCSI 设备是不会有寄存器操作的)。物理设备不同该驱动层的程序就不同,比如对于 SAS 直连的磁盘,该驱动层的程序就是 SAS 驱动,而如果是 FC-HBA 卡连接的 FC-SAN,那么这个驱动层就是 FC 驱动(比如 Qlogic 的驱动)。

图 1 块设备分层

最下面一层是设备层,设备层通常是一个硬件设备。这里的硬件种类繁多,比如 SAS 卡、SATA 卡、FC-HBA 卡或者 iSCSI-HBA 卡等等。但有的时候又可能并不是硬件设备,比如对于 iSCSI 来说,该层可能是通过软件模拟的一个设备层,而其请求则是通过网卡发送到目标器端。

主要数据结构及流程

绝大多数程序都是由数据结构和算法 2 部分内容组成的,数据结构相当于程序的骨架,而算法则是程序的筋和肉。通过算法将数据结构关联起来,从而形成一个完整的整体。人类认识问题的规律是从具体到抽象,从简单到复杂,因此我们先从数据结构开始。理解了数据关键的数据结构,那我们就能更加容易的理解块设备 IO 的整个逻辑。

在块设备 IO 中最为关键的数据结构是 request_queue,也就是请求队列。该数据结构的简图如图 2 所示,这个数据结构本身非常复杂,我们这里进行了简化,只保留了部分关键的成员。如图彩色部分是 2 个函数指针,分别用于接收请求和处理请求。

图 2 请求队列数据结构

为了便于理解,我们这里举一个例子。以 NBD 块设备为例,在块设备初始化的时候 make_request_fn 被初始化为 blk_queue_bio,request_fn 被初始化为 do_nbd_request。对于 SCSI 块设备而言,request_fn 会被初始化为 scsi_request_fn。

有了上面数据结构的知识及关键成员初始化的结果,接下来我们就可以分析一下块设备的整个流程的细节。块设备请求的入口是 submit_bio,经过简单的检查后调用

由上述代码可以看出 IO 处理的入口函数其实是函数指针 make_request_fn,而我们知道该指针实际上是函数 blk_queue_bio。因此块设备的请求会由 blk_queue_bio 函数进行处理。

磁盘调度策略

Linux 内核在设计磁盘的调度策略时提供了极大的灵活性。磁盘的调度策略以插件的注册到内核当中,也就是用户可以自由的选择磁盘的调度策略。

调度算法的思想其实非常简单,主要是通过对 IO 的排序、合并和批量处理来优化磁盘寻道和请求的处理时间。这里值得说明的目前的调度算法其实更多的是针对机械磁盘,因为机械磁盘磁头定位耗时占整个 IO 处理时间的很大比例。当然对于 SSD 磁盘,调度算法也有一定的帮助,这就需要针对 IO 的特性具体来看了。

图 3 调度策略结构体

磁盘调度策略的结构体定义如图 3 所示,各个变量的含义也是比较明确,本文不再赘述。本文主要看一下   其中 elevator_ops 类型的变量 ops,这个变量是调度策略具体的功能实现,任何调度算法都要实现其中某些函数。

调度策略的实现就是通过这些回调函数完成的。为了理解调度策略的函数集具体做哪些事情,本文整理了一个表格,我们先从整体上看一下每个函数具体做了哪些事情。对于调度策略来说,这里的函数并非每个都要实现,下表中只有带 * 的才是必须要实现的函数。

简而言之,上述回调函数的功能就是判断请求是否可以被合并、执行合并和请求下发等等操作。上述回调函数比较多,而且使用场景也比较复杂,具体使用分散在调度器的很多流程中。因此,我们很难一下子介绍清楚所有的场景。为了更加直观的理解上述回调函数的作用,我们以 Deadline 调度策略为例进行简单的介绍。

如图 4 是 Deadline 初始化的回调函数,从图中可以看出这里并没有初始化所有的回调函数,而只初始化了 16 个回调函数中的 9 个。

图 4 Deadline 回调函数

我们具体分析一下函数的调用场景,前文我们介绍到 elevator_merge_fn 函数用于查询可以与 bio 合并的请求。如图 5 所示为整个调用栈,入口为 blk_queue_bio,这个函数我们之前介绍过,它就是调度程序的入口。该函数调用 elv_merge 用于查找是否有可以合并的请求,并返回。而 elv_merge 函数调用的正式 Deadline 调度器提供的回调函数。完成判断后,该函数会根据实际情况返回请求 (或者没有找到,不返回) 和可合并的方向(例如向前合并,向后合并等),后续流程就是进行具体的合并操作了。

图 5 函数调用栈

以上就是关于“Linux 块设备中的 IO 路径及调度策略是什么”这篇文章的内容,相信大家都有了一定的了解,希望丸趣 TV 小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计2315字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 四虎影片 | 中文字幕无码一区二区免费 | 免费高清a级毛片在线播放 免费高清不卡毛片在线看 免费高清成人性视频3p网站 | 无码国产福利av私拍 | 国模冰莲自慰肥美胞极品人体图 | 亚洲av综合a色av中文 | 精品新一区二区三区四区 | 亚洲色图网站 | 国产日产欧产精品精品软件 | 成人亚洲欧美日韩在线观看 | 亚洲乱色熟女一区二区三区丝袜 | 国产97在线 | 中文 | 国产破外女出血视频 | 国产一区在线视频观看 | 久久久久亚洲av片无码下载蜜桃 | 欧美一级毛片免费看高清 | 91免费在线播放 | 亚洲精品国产suv一区 | 岛国伊人 | 国产99视频精品草莓免视看 | 在线国产欧美 | 亚洲欧美激情日韩在线 | 亚洲日韩色图 | 欧美中文字幕在线 | 国产成人精品免费视频app软件 | 97成人精品区在线播放 | 四虎在线视频免费观看视频 | 中文字幕av在线一二三区 | 亚洲av无码一区二区三区人 | 中文天堂最新版www官网在线 | 国产成人精品三级麻豆 | 九九精品免视频国产成人 | 国产午夜精品一区二区三区四区 | 可以直接免费观看的av网站 | 免费一本色道久久一区 | 色偷偷亚洲第一综合网 | 国产激情久久久久久熟女老人av | xx性欧美肥妇精品久久久久久 | 少妇久久久久久被弄到高潮 | 用舌头去添高潮无码av在线观看 | 亚洲一级免费毛片 |