12 微调 I/O 性能 #
I/O 调度用于控制将输入/输出操作提交到储存空间的方式。SUSE Linux Enterprise Server 提供适合不同工作负载的各种 I/O 算法(称为电梯算法
)。电梯算法有助于减少搜寻操作并可指定 I/O 请求的优先级。
如何选择最合适的 I/O 电梯算法不仅取决于工作负载,还取决于硬件。例如,每个 ATA 磁盘系统、SSD、RAID 阵列或网络储存系统都需要不同的微调策略。
12.1 切换 I/O 调度 #
SUSE Linux Enterprise Server 在引导时会选取默认的 I/O 调度程序,您可以针对每个块设备即时更改此设置。例如,可为托管系统分区的设备以及托管数据库的设备设置不同的算法。
根据设备是否报告为旋转磁盘为每个设备选择默认 I/O 调度程序。如果是旋转磁盘,则选取 BFQ
I/O 调度程序。其他设备默认选择 MQ-DEADLINE
或 NONE
。
要更改正在运行的系统中特定设备的电梯算法,请运行以下命令:
tux >
sudo
echo SCHEDULER > /sys/block/DEVICE/queue/scheduler
此处,SCHEDULER 是 bfq
、none
、kyber
或 mq-deadline
其中之一。DEVICE 是块设备(例如 sda
)。请注意,此项更改在重引导期间不会保留。要对特定设备进行永久性的 I/O 调度程序更改,请将用于切换 I/O 调度程序的命令放入 init 脚本,或将相应的 udev 规则添加到 /lib/udev/rules.d/
中。有关此类微调的示例,请参见 /lib/udev/rules.d/60-io-scheduler.rules
。
在 IBM Z 上,储存设备的默认 I/O 调度程序由设备驱动程序设置。
elevator
引导参数不再适用于使用 blk-mq I/O 路径的设备。
12.2 使用 blk-mq I/O 路径的可用 I/O 电梯算法 #
下面是 SUSE Linux Enterprise Server 上可用于使用 blk-mq I/O 路径的设备的电梯算法列表。如果某个电梯算法包含可调参数,可使用以下命令设置这些参数:
echo VALUE > /sys/block/DEVICE/queue/iosched/TUNABLE
在上述命令中,VALUE 是 TUNABLE 的所需值,DEVICE 是块设备。
要确定某个设备(例如 sda
)适用哪些电梯算法,请运行以下命令(当前选择的调度程序列在方括号中):
tux >
cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none
从设备的传统块切换到 blk-mq I/O 路径时,none
选项大致相当于 noop
,mq-deadline
相当于 deadline
,bfq
相当于 cfq
。
12.2.1 MQ-DEADLINE
#
MQ-DEADLINE
是延迟导向的 I/O 调度程序。MQ-DEADLINE
具有以下可调参数:
MQ-DEADLINE
可调参数 #文件 | 说明 |
---|---|
| 控制优先处理读取操作而不是写入操作的次数。值 默认值为 |
| 设置读取操作的最后期限(当前时间加 默认值为 |
| 设置写入操作的最后期限(当前时间加 默认值为 |
| 启用 (1) 或禁用 (0) 前端合并请求尝试。 默认值为 |
| 设置每批的最大请求数(仅检查批的最后期限失效时间)。使用此参数可在延迟与吞吐量之间实现平衡。如果设置为 默认值为 |
12.2.2 NONE
#
如果选择 NONE
作为 blk-mq 的 I/O 电梯算法选项,则不会使用任何 I/O 调度程序,并且 I/O 请求将传递给设备,而不做进一步的 I/O 调度交互。
NONE
是 NVM Express 设备的默认值。与其他 I/O 电梯算法选项相比,此选项不会产生开销,被认为是通过多个队列向此类设备传递 I/O 请求最快的方式。
NONE
没有可调参数。
12.2.3 BFQ
(预算公平队列) #
BFQ
是以公平性为导向的调度程序。其描述为“基于 CFQ 片服务模式的按比例储存 I/O 调度算法。但 BFQ 会向进程指派预算(以扇区数计)而不是时间片。”(信息来源:linux-4.12/block/bfq-iosched.c)
BFQ
允许向调度决策期间要考虑的任务指派 I/O 优先级(请参见第 8.3.3 节 “使用 ionice
指定磁盘访问优先级”)。
BFQ
调度程序具有以下可调参数:
BFQ
可调参数 #文件 | 说明 |
---|---|
| 值以毫秒为单位,指定处于空闲状态多长时间,以等待对空队列发出下一个请求。 默认值为 |
| 与 默认值为 |
| 启用 (1) 或禁用 (0) 默认值为 |
| 向后搜寻的最大值(以 KB 为单位)。 默认值为 |
| 用于计算向后搜寻的成本。 默认值为 |
| 用于设置异步请求超时的值(以毫秒为单位)。 默认值为 |
| 值以毫秒为单位,指定同步请求的超时。 默认值为 |
| 选择某个任务(队列)后,为其提供服务的最长时间(以毫秒为单位)。 默认值为 |
| 在 默认值为 |
| 启用 (1) 或禁用 (0),需要 默认值为 |
12.2.4 KYBER
#
KYBER
是以延迟为导向的 I/O 调度程序。使用它可以设置读取操作和同步写入操作的目标延迟,并限制 I/O 请求以尝试符合这些目标延迟。
KYBER
可调参数 #文件 | 说明 |
---|---|
| 设置读取操作的目标延迟,以纳秒为单位。 默认值为 |
| 设置写入操作的目标延迟,以纳秒为单位。 默认值为 |
12.3 I/O 屏障微调 #
在完成 fsync 之后或在事务提交期间,大多数文件系统(例如 XFS、Ext3 或 Ext4)会将写入屏障发送到磁盘。写入屏障会强制按正确排序写入,以确保能安全使用非永久磁盘写入缓存(但会使性能有一定程度的下降)。如果您的磁盘以这样或那样的方式采用了电池供电机制,禁用屏障可以安全地改善性能。
您可以使用 nobarrier
装入选项禁用发送写入屏障。
当磁盘无法保证在电源故障情况下正确写入缓存时,禁用屏障可能会导致严重的文件系统损坏和数据丢失。