本文详细介绍了 Linux 操作系统中的不同I/O调度算法,如Noop、CFQ、Deadline、BFQ和预期I/O调度程序,并对它们的性能进行了比较。了解这些调度算法有助于提高系统的磁盘访问效率和应用程序响应时间。
首先,让我们回顾一下操作系统中的调度是什么。我们可以区分操作系统中的两种类型的调度程序:进程调度程序和I/O调度程序。我们对后者感兴趣。I/O 调度程序是块设备和低级驱动程序之间的一层。它旨在提供对磁盘设备的最佳进程访问。尽管调度程序的工作表面上很简单,但由于磁盘操作是一个非常慢的操作并且在磁盘上搜索必要的扇区不会很快发生,因此这种简单性被消除了。同时,进程正在等待轮流访问磁盘。I/O 调度程序应该能够按照优先级提供信息,并确保应用程序在一定时间内接收到数据。
在早期版本的 Linux 中,只有一个 I/O 调度程序:Linus Elevator。太原始了,因此在2.6内核中,又出现了三个调度器。让我们详细考虑调度程序。
Noop
Noop是最简单的调度程序。它简单地将所有请求放入 FIFO 队列中并执行它们。请注意,无论 I/O 请求的类型如何,系统中存在的所有进程都会发生这种情况。此外,noop 能够合并一些请求。类似目的的读/写请求被组合起来,以减少磁盘操作次数并增加系统调用的长度。
CFQ
CFQ 作为网络调度程序 SFQ(随机公平队列)的扩展出现。CFQ 与 Noop 的不同之处在于,它为每个进程都有单独的队列。当队列不为空或指定的时间片未过期时,调度程序会循环服务每个进程(最后一个条件与进程调度程序类似)。在每个队列的范围内,读操作的优先级高于写操作。
Deadline
Deadline 是标准调度程序。从其名称可以明显看出,Deadline 尝试在指定时间执行请求。Deadline 支持两个特殊的截止时间队列(按过期时间排序)和两个用于读写操作的排序队列(按扇区编号排序)。截止日期队列旨在防止请求匮乏。Deadline 批量处理请求。批次是按 LBA 递增顺序排列的 I/O 操作序列。读操作比写操作具有更高的优先级,就像在 CFQ 中一样,因为进程通常会阻塞读操作。因此,读操作的过期时间为 500 毫秒,而写操作的过期时间为 5 秒。在下一个请求之前,Deadline 必须选择一个队列以供使用(读或写)。该算法更适合读操作较多的系统,如数据库、Web服务器等。
BFQ
BFQ(Budget Fair Queueing)是一种基于CFQ的比例份额磁盘调度算法。BFQ将基于时间间隔的Round Robin调度算法进行了转换,使其更加关注磁盘扇区数。每个任务都有一个专用的部门预算,该预算可能会根据任务的行为而有所不同。BFQ 保证磁盘流量会在任务之间更加诚实地分配,并将查询磁盘数据的复杂度降低到 O(1)。
预期 I/O 调度程序
预期 I/O 调度程序尝试猜测后续请求将在磁盘的哪些块上执行,并尝试聚合和/或重新排序请求,从而改进局部性并减少磁盘寻道操作。该算法在当前读操作看似完成时为下一次读操作做好准备。
对读取操作有效的调度算法(例如 Deadline 或 Anticipatory)可以为 Web 服务器或数据库带来性能提升。您可以通过调整调度程序参数来充分加快 Apache Web 服务器的速度。
您可以通过此命令检查可用调度程序的列表(当前调度程序分配在方括号中):
$ cat /sys/block/sda/queue/scheduler
我的 Linux 机器上的输出是 noop [deadline] cfq .
有很多不错的工具可以比较调度算法的性能。我用于 hdparm 写作基准。hdparm 包含默认基准(但您可以使用自己的基准)。的用法hdparm 是:
$ apt-get install hdparm $ hdparm -tT /dev/sda
为了比较算法的性能,我们必须将调度程序从默认更改为任意。您可以使用下一个命令来执行此操作:
$ echo {SCHEDULER_NAME} > /sys/block/sda/queue/scheduler
hdparm 提供定时缓存读取和定时缓冲磁盘读取。当然,您可以使用其他方法进行测试,例如 dd 命令或bonnie++。文章来源:https://www.toymoban.com/diary/system/427.html
文章来源地址https://www.toymoban.com/diary/system/427.html
到此这篇关于Linux 中的 I/O 调度算法解析及性能比较的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!