Red Hat Training

A Red Hat training course is available for RHEL 8

第 15 章 设置磁盘调度程序

磁盘调度程序负责订购提交至存储设备的 I/O 请求。

您可以通过几种不同方式配置调度程序:

注意

在 Red Hat Enterprise Linux 8 中,块设备只支持多队列调度。这可让块层性能针对使用快速固态驱动器(SSD)和多核系统进行正常扩展。

Red Hat Enterprise Linux 7 及更早版本中提供的传统的单队列调度程序已被删除。

15.1. 可用磁盘调度程序

Red Hat Enterprise Linux 8 支持以下多队列磁盘调度程序:

none
实施一向先出(FIFO)调度算法。它通过简单的最后一个缓存合并通用块层的请求。
mq-deadline

尝试从请求到达调度程序时起为请求提供保证的延迟。

mq-deadline 调度程序将排队的 I/O 请求排序为读或写批处理,然后调度它们以增加逻辑块寻址(LBA)顺序来执行。默认情况下,读取批处理优先于写入批处理,因为应用更有可能阻止读取 I/O 操作。mq-deadline 处理批处理后,它会检查处理器时间不足的时间,并根据情况调度下一个读取或写入批处理。

此调度程序适用于大多数用例,特别是写操作大部分异步的情况。

bfq

以桌面系统和互动任务为目标。

bfq 调度程序确保单个应用程序永远不会使用所有带宽。实际上,存储设备总是像它们处于闲置时一样进行响应。在默认配置中,bfq 着重提供最低延迟,而不是实现最大吞吐量。

bfq 基于 cfq 代码。它不会为每个进程分配一个固定时间片段的磁盘,而是以扇区数为进程分配一个预算

此调度程序适合用于复制大型文件,在这种情况下,系统也不会变得无响应。

kyber

调度程序通过计算提交至块 I/O 层的每个 I/O 请求的延迟来调整自身以达到延迟目标。如果出现缓存缺少和同步写入请求,您可以为读取配置目标延迟。

这个调度程序适合快速设备,如 NVMe、SSD 或其他低延迟设备。

15.2. 不同用例的不同磁盘调度程序

根据您的系统执行的任务,在分析和调整任务之前,建议使用以下磁盘调度程序作为基准:

表 15.1. 适用于不同用例的磁盘调度程序

使用案例磁盘调度程序

传统的使用 SCSI 接口的 HDD

使用 mq-deadlinebfq

高性能 SSD 或具有快速存储的 CPU 绑定系统

使用 none,特别是在运行企业级应用程序时。另外,还可使用 kyber

桌面或互动任务

使用 bfq

虚拟客户端

使用 mq-deadline。对于支持多队列的主机总线适配器(HBA)驱动程序,请使用 none

15.3. 默认磁盘调度程序

块设备使用默认磁盘调度程序,除非您指定了另一个调度程序。

注意

对于 non-volatile Memory Express (NVMe) 块设备,默认调度程序是 none,红帽建议不要更改它。

内核根据设备类型选择默认磁盘调度程序。自动选择的调度程序通常是最佳设置。如果您需要不同的调度程序,红帽建议使用 udev 规则或 Tuned 应用程序进行配置。匹配所选设备并只为那些设备切换调度程序。

15.4. 确定活跃磁盘调度程序

此流程决定了哪个磁盘调度程序目前在给定块设备中活跃。

流程

  • 阅读 /sys/block/device/queue/scheduler 文件的内容:

    # cat /sys/block/device/queue/scheduler
    
    [mq-deadline] kyber bfq none

    在文件名中,使用块设备名称替换 device,例如 sdc

    活跃调度程序列在方括号([ ])中。

15.5. 使用 Tuned 设置磁盘调度程序

此流程创建并启用 Tuned 配置集,该配置集为所选块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。

在以下命令和配置中替换:

  • 带有块设备名称的设备,例如: sdf
  • 带有您要为该设备设置的磁盘调度程序的 selected-scheduler,例如 bfq

先决条件

流程

  1. 可选:选择一个您配置集将要基于的现有 Tuned 配置集。有关可用配置集列表,请参阅 RHEL 提供的 Tuned 配置集

    要查看哪个配置集当前处于活跃状态,请使用:

    $ tuned-adm active
  2. 创建一个新目录来保存您的 Tuned 配置集:

    # mkdir /etc/tuned/my-profile
  3. 查找所选块设备系统唯一标识符:

    $ udevadm info --query=property --name=/dev/device | grep -E '(WWN|SERIAL)'
    
    ID_WWN=0x5002538d00000000_
    ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    ID_SERIAL_SHORT=20120501030900000
    注意

    本例中的 命令将返回标识为全局名称(WWN)或与指定块设备关联的序列号的所有值。虽然最好使用 WWN,但 WWN 并不总是可用于给定设备,示例命令返回的任何值都可用作设备系统唯一 ID

  4. 创建 /etc/tuned/my-profile/tuned.conf 配置文件。在该文件中设置以下选项:

    1. 可选:包含现有配置集:

      [main]
      include=existing-profile
    2. 为与 WWN 标识符匹配的设备设置所选磁盘调度程序:

      [disk]
      devices_udev_regex=IDNAME=device system unique id
      elevator=selected-scheduler

      在这里:

      • 使用正在使用的标识符的名称替换 IDNAME (例如 ID_WWN)。
      • 将设备系统唯一 id 替换为所选标识符的值(例如 0x5002538d00000000)。

        要匹配 devices_udev_regex 选项中的多个设备,请将标识符括在括号中,并使用竖线分隔它们:

        devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)
  5. 启用您的配置集:

    # tuned-adm profile my-profile

验证步骤

  • 验证 Tuned 配置集是否活跃并应用:

    $ tuned-adm active
    
    Current active profile: my-profile
    $ tuned-adm verify
    
    Verification succeeded, current system settings match the preset profile.
    See tuned log file ('/var/log/tuned/tuned.log') for details.

15.6. 使用 udev 规则设置磁盘调度程序

此流程使用 udev 规则为特定块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。

在以下命令和配置中替换:

  • 带有块设备名称的设备,例如: sdf
  • 带有您要为该设备设置的磁盘调度程序的 selected-scheduler,例如 bfq

流程

  1. 查找块设备系统唯一标识符:

    $ udevadm info --name=/dev/device | grep -E '(WWN|SERIAL)'
    E: ID_WWN=0x5002538d00000000
    E: ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    E: ID_SERIAL_SHORT=20120501030900000
    注意

    本例中的 命令将返回标识为全局名称(WWN)或与指定块设备关联的序列号的所有值。虽然最好使用 WWN,但 WWN 并不总是可用于给定设备,示例命令返回的任何值都可用作设备系统唯一 ID

  2. 配置 udev 规则。使用以下内容创建 /etc/udev/rules.d/99-scheduler.rules 文件:

    ACTION=="add|change", SUBSYSTEM=="block", ENV{IDNAME}=="device system unique id", ATTR{queue/scheduler}="selected-scheduler"

    在这里:

    • 使用正在使用的标识符的名称替换 IDNAME (例如 ID_WWN)。
    • 将设备系统唯一 id 替换为所选标识符的值(例如 0x5002538d00000000)。
  3. 重新载入 udev 规则:

    # udevadm control --reload-rules
  4. 应用调度程序配置:

    # udevadm trigger --type=devices --action=change

验证步骤

  • 验证活跃的调度程序:

    # cat /sys/block/device/queue/scheduler

15.7. 为特定磁盘临时设置调度程序

此流程为特定块设备设置给定磁盘调度程序。系统重启后该设置不会保留。

流程

  • 将所选调度程序的名称写入 /sys/block/device/queue/scheduler 文件:

    # echo selected-scheduler > /sys/block/device/queue/scheduler

    在文件名中,使用块设备名称替换 device,例如 sdc

验证步骤

  • 验证调度程序是否在该设备中活跃:

    # cat /sys/block/device/queue/scheduler