在 Linux 中如何使 IO 磁盘调度程序的修改在重启后依然生效

I/O 调度控制输入/输出操作将如何提交到存储。
根据最终用户的要求,可以使用各种算法。
这些算法可以帮助减少搜索操作,并可以优先考虑 I/O 请求。

选择最适合的 I/O 调度程序和算法不仅取决于工作负载,还取决于硬件。
例如,单个 ATA 磁盘系统、SSD、RAID 数组或者网络存储系统都需要不同的调优策略。

可以使用以下文件验证默认的 Io 调度选项

# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]

正如我在 SLES 上观察到的,默认 IO 调度程序是“cfq”,而对于 Red Hat Enterprise Linux 7,它是 [deadline]。
本文的步骤已在 SLES 11 和 RHEL 7 上验证

在本文中,我不会传达每个调度程序和算法的用法,因此假设我们知道哪个调度程序符合目的,并且我们希望相同的更改在重启后保持不变。

默认情况下,我们对算法执行的更改仅适用于当前会话。

我在这里使用的算法术语是指我们为单个调度程序设置的值。
例如
CFQ 有以下算法

# ls -l /sys/block/sda/queue/iosched/
total 0
-rw-r--r-- 1 root root 4096 Jan 11 10:54 back_seek_max
-rw-r--r-- 1 root root 4096 Jan 11 10:54 back_seek_penalty
-rw-r--r-- 1 root root 4096 Jan 11 10:54 fifo_expire_async
-rw-r--r-- 1 root root 4096 Jan 11 10:54 fifo_expire_sync
-rw-r--r-- 1 root root 4096 Jan 11 10:54 group_idle
-rw-r--r-- 1 root root 4096 Jan 11 10:54 low_latency
-rw-r--r-- 1 root root 4096 Jan 11 10:54 quantum
-rw-r--r-- 1 root root 4096 Jan 11 10:54 slice_async
-rw-r--r-- 1 root root 4096 Jan 11 10:54 slice_async_rq
-rw-r--r-- 1 root root 4096 Jan 11 10:54 slice_idle
-rw-r--r-- 1 root root 4096 Jan 11 10:54 slice_sync

因此,假设我们想修改这些值,但我们所做的更改仅对当前会话有效,如果我们想在重新启动后使其永久有效,请按照以下步骤操作

为了这篇文章,我想将默认的“low_latency”值“0”更改为“1”

让我们验证 low_latency 的默认值

# cat /sys/block/sda/queue/iosched/low_latency
0

如果我们有多个磁盘,那么对于每个磁盘,我们将有不同的部分,上面我展示的是 sda
对于 sdb 也是如此,因为我有两个磁盘软件 raid 节点

# cat /sys/block/sdb/queue/iosched/low_latency
0

导航到规则目录

# cd /lib/udev/rules.d/

搜索正在设置 IO 调度程序值的任何规则文件(如果还没有)。
如果没有这样的文件,则创建一个新文件

# touch 60-ssd-scheduler.rules

将以下内容添加到新文件中

ACTION=="add|change", KERNEL=="sd[a-z]", TEST!="queue/iosched/low_latency", ATTR{queue/scheduler}="cfq"
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/iosched/low_latency}="1", ATTR{queue/scheduler}="cfq"

保存并退出文件

在这里,我们请求对所有可用磁盘 (sd[a-z]) 进行“添加/更改”,并进行两次更改

  • 将 IO 调度程序更改为“cfq”
  • 将 low_latency 更改为“1”

同样,我们可以使用此文件为更多算法更改添加规则。

接下来通过执行以下命令来验证更改是否有效

# udevadm test /sys/block/sda
(This will throw a long output, look out for below lines)
ATTR '/sys/devices/pci0000:00/0000:00:15.0/0000:03:00.0/host0/target0:0:0/0:0:0:0/block/sda/queue/scheduler' writing 'cfq' /usr/lib/udev/rules.d/60-ssd-scheduler.rules:1
ATTR '/sys/devices/pci0000:00/0000:00:15.0/0000:03:00.0/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/low_latency' writing '1' /usr/lib/udev/rules.d/60-ssd-scheduler.rules:2
ATTR '/sys/devices/pci0000:00/0000:00:15.0/0000:03:00.0/host0/target0:0:0/0:0:0:0/block/sda/queue/scheduler' writing 'cfq' /usr/lib/udev/rules.d/60-ssd-scheduler.rules:2

然后验证现有会话上的更改

# cat /sys//block/sda/queue/iosched/low_latency
1
# cat /sys//block/sdb/queue/iosched/low_latency
1

最后继续重新启动,以确保即使在重新启动后您的更改也存在。

日期:2020-06-02 22:17:02 来源:oir作者:oir