跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 系统分析和微调指南 / 内核微调 / 微调 I/O 性能
适用范围 SUSE Linux Enterprise Server 15 SP3

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-DEADLINENONE

要更改正在运行的系统中特定设备的电梯算法,请运行以下命令:

tux > sudo echo SCHEDULER > /sys/block/DEVICE/queue/scheduler

此处,SCHEDULERbfqnonekybermq-deadline 其中之一。DEVICE 是块设备(例如 sda)。请注意,此项更改在重引导期间不会保留。要对特定设备进行永久性的 I/O 调度程序更改,请将用于切换 I/O 调度程序的命令放入 init 脚本,或将相应的 udev 规则添加到 /lib/udev/rules.d/ 中。有关此类微调的示例,请参见 /lib/udev/rules.d/60-io-scheduler.rules

注意
注意:IBM Z 上的默认调度程序

在 IBM Z 上,储存设备的默认 I/O 调度程序由设备驱动程序设置。

注意
注意:已去除 elevator 引导参数

已去除 elevator 引导参数。blk-mq I/O 路径取代了 cfq,前者并不包含 elevator 引导参数。

12.2 使用 blk-mq I/O 路径的可用 I/O 电梯算法

下面是 SUSE Linux Enterprise Server 上可用于使用 blk-mq I/O 路径的设备的电梯算法列表。如果某个电梯算法包含可调参数,可使用以下命令设置这些参数:

echo VALUE > /sys/block/DEVICE/queue/iosched/TUNABLE

在上述命令中,VALUETUNABLE 的所需值,DEVICE 是块设备。

要确定某个设备(例如 sda)适用哪些电梯算法,请运行以下命令(当前选择的调度程序列在方括号中):

tux > cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none
注意
注意:从传统块切换到 blk-mq I/O 路径时的调度程序选项

从设备的传统块切换到 blk-mq I/O 路径时,none 选项大致相当于 noopmq-deadline 相当于 deadlinebfq 相当于 cfq

12.2.1 MQ-DEADLINE

MQ-DEADLINE 是延迟导向的 I/O 调度程序。MQ-DEADLINE 具有以下可调参数:

表 12.1︰ MQ-DEADLINE 可调参数

文件

说明

writes_starved

控制优先处理读取操作而不是写入操作的次数。值 3 表示在执行写入操作之前可以执行三次读取操作,读取操作按照相同的选择准则进行调度。

默认值为 3

read_expire

设置读取操作的最后期限(当前时间加 read_expire 值),以毫秒为单位。

默认值为 500

write_expire

设置写入操作的最后期限(当前时间加 write_expire 值),以毫秒为单位。

默认值为 5000

front_merges

启用 (1) 或禁用 (0) 前端合并请求尝试。

默认值为 1

fifo_batch

设置每批的最大请求数(仅检查批的最后期限失效时间)。使用此参数可在延迟与吞吐量之间实现平衡。如果设置为 1(即每批一个请求),则会产生“先到先得”行为,通常可将延迟降到最低。设置更大的值通常会提高吞吐量。

默认值为 16

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 调度程序具有以下可调参数:

表 12.2︰ BFQ 可调参数

文件

说明

slice_idle

值以毫秒为单位,指定处于空闲状态多长时间,以等待对空队列发出下一个请求。

默认值为 8

slice_idle_us

slice_idle 相同,但以微秒为单位。

默认值为 8000

low_latency

启用 (1) 或禁用 (0) BFQ 的低延迟模式。此模式优先处理特定的应用程序(例如,如果是交互式的),使其保持较低的延迟。

默认值为 1

back_seek_max

向后搜寻的最大值(以 KB 为单位)。

默认值为 16384

back_seek_penalty

用于计算向后搜寻的成本。

默认值为 2

fifo_expire_async

用于设置异步请求超时的值(以毫秒为单位)。

默认值为 250

fifo_expire_sync

值以毫秒为单位,指定同步请求的超时。

默认值为 125

timeout_sync

选择某个任务(队列)后,为其提供服务的最长时间(以毫秒为单位)。

默认值为 124

max_budget

timeout_sync 内为其提供服务的扇区数上限。如果设置为 0, BFQ 将在内部根据 timeout_sync 和估计的峰值速率计算出一个值。

默认值为 0(设置为自动微调)。

strict_guarantees

启用 (1) 或禁用 (0),需要 BFQ 特定队列处理,才能在特定条件下做出更严格的带宽共享保证。

默认值为 0

12.2.4 KYBER

KYBER 是以延迟为导向的 I/O 调度程序。使用它可以设置读取操作和同步写入操作的目标延迟,并限制 I/O 请求以尝试符合这些目标延迟。

表 12.3︰ KYBER 可调参数

文件

说明

read_lat_nsec

设置读取操作的目标延迟,以纳秒为单位。

默认值为 2000000

write_lat_nsec

设置写入操作的目标延迟,以纳秒为单位。

默认值为 10000000

12.3 I/O 屏障微调

在完成 fsync 之后或在事务提交期间,某些文件系统(例如 Ext3 或 Ext4)会向磁盘发送写屏障。写屏障会强制按正确排序写入,以确保能安全使用非永久磁盘写入缓存(但会使性能有一定程度的下降)。如果您的磁盘以这样或那样的方式采用了电池供电机制,禁用屏障可以安全地改善性能。

重要
重要:XFS 中的 nobarrier 已弃用

请注意,XFS 的 nobarrier 选项已完全弃用,它在 SUSE Linux Enterprise 15 SP2 和更高版本中不是有效的挂载选项。任何显式指定该标志的 XFS 挂载命令将无法挂载文件系统。为防止发生这种问题,请确保不存在任何包含 nobarrier 选项的脚本或 fstab 项。

您可以使用 nobarrier 挂载选项禁用发送写屏障。

警告
警告:禁用屏障可能导致数据丢失

当磁盘无法保证在电源故障情况下正确写入缓存时,禁用屏障可能会导致严重的文件系统损坏和数据丢失。