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
最后继续重新启动,以确保即使在重新启动后您的更改也存在。