I/O 计划

本主题详细说明如何将 I/O 计划更改为支持的调度程序。Vertica 要求将“I/O 计划 (I/O Scheduling)”设置为 deadlinenoop。安装程序会检查系统正在使用什么调度程序,从而以标识符 S0150 报告不支持的调度程序问题。如果安装程序未能检测到使用的调度程序类型(如果系统使用的是 RAID 阵列通常会这样),则会以标识符 S0151 报告此问题。

如果系统使用的不是 RAID 阵列,则完成以下步骤,以便将系统更改为支持的 I/O 调度程序。如果使用的是 RAID 阵列,则查询 RAID 供应商文档,了解能够为您的硬件提供最佳性能的调度程序。

配置 I/O 调度程序

Linux 内核可使用多种不同的 I/O 调度程序来设置磁盘输入和输出的优先级。大多数 Linux 发行版默认使用完全公平队列 (CFQ) 方案,该方案为输入和输出请求设定同等优先级。此调度程序在运行需要同等 I/O 资源访问权的多个任务的系统上非常高效。但在包含编录和数据目录的 Vertica 驱动器上使用时,可能会产生瓶颈,因为它为写入请求提供了与读取请求同等的优先级,而且其每进程 I/O 队列可能会使请求数量多于其他进程的进程处于不利地位。

对于包含编录和数据目录的驱动器,配置主机使用 Deadline 或 NOOP I/O 调度程序,而不是 CFQ 调度程序:

  • Deadline 调度程序为读取请求提供高于写入请求的优先级。它还对所有请求施加截止期限。在达到截止期限后,这类请求将获得高于其他所有请求的优先级。此计划方法有助于防止进程出现 I/O 访问短缺的情况。Deadline 调度程序最适合在物理介质驱动器(使用旋转盘片的磁盘)上使用,因为它会尝试将磁盘上相邻扇区的访问请求进行分组,从而缩短驱动器花在寻道上的时间。

  • NOOP 调度程序使用简单的 FIFO 方法,将所有输入和输出请求置于一个队列中。此调度程序最适合在固态硬盘 (SSD) 上使用。由于 SSD 没有物理读取磁头,因此在访问非相邻扇区时不存在性能损失。

对于包含编录和数据目录的 Vertica 驱动器,如果不使用以上调度程序中的一种,可能导致数据库性能下降。系统中的其他驱动器(例如包含交换空间、日志文件或 Linux 系统文件的驱动器)仍可以使用默认的 CFQ 调度程序(尽管对于 SSD 而言应该始终使用 NOOP 调度程序)。

有两种方法可以设置磁盘设备所用的调度程序:

  1. 将调度程序的名称写入 /sys 目录中的文件。

    --或--

  2. 使用内核启动参数。

配置 I/O 调度程序 - 通过 /sys 目录更改调度程序

可以使用 /sys 目录下面的虚拟文件来查看和更改 Linux 用于单个驱动器的 I/O 请求的调度程序。控制数据块设备所用的调度程序的文件名称为:

/sys/block/deviceName/queue/scheduler

其中,deviceName 是磁盘设备的名称,例如 sdacciss\\!c0d1(Micro Focus RAID 阵列上的第一个磁盘)。通过查看此文件的内容可以显示调度程序的所有可能设置。当前选择的调度程序用方括号括起来:

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

要更改调度程序,请将您希望设备使用的调度程序的名称写入到其调度程序文件中。必须具有 root 用户权限才能写入此文件。例如,要设置 sda 驱动器使用 Deadline 调度程序,请以 root 用户身份运行以下命令:


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

更改调度程序会立即影响设备的 I/O 请求。Linux 内核开始对所有驱动器的输入和输出请求使用新的调度程序。

通过 /sys 目录对 I/O 调度程序做出的更改仅持续到系统重新引导为止,因此需要在启动脚本中添加用于更改 I/O 调度程序的命令(例如存储在 /etc/init.d 中的脚本,或通过 /etc/rc.local 中的命令)。此外还需要为系统中的想要更改其调度程序的每个驱动器使用单独的命令。

例如,使配置立即生效并将其添加到 rc.local,以便在后续重新引导时使用该配置。

echo deadline > /sys/block/sda/queue/scheduler
echo 'echo deadline > /sys/block/sda/queue/scheduler' >> /etc/rc.local

如果系统包含混合的固态硬盘和物理介质驱动器,或者包含大量未存储 Vertica 编录和数据目录的驱动器,则可以优先使用这种方法来设置 I/O 调度程序,而不是使用启动参数。

如果您使用的是 Red Hat 7.0 或 CentOS 7.0 或更高版本,请以 root 或 sudo 身份运行以下命令:

$ chmod +x /etc/rc.d/rc.local

配置 I/O 调度程序 - 使用启动参数更改调度程序

使用 elevator 内核启动参数来更改系统中所有磁盘所用的默认调度程序。如果主机中的大多数或所有驱动器都是同一类型(物理介质或 SSD)并且将会包含编录或数据文件,则这是可使用的最佳方法。此外还可以使用启动参数来更改系统中大多数驱动器所需的调度程序默认设置,然后使用 /sys 文件来将单独的驱动器更改为其他 I/O 调度程序。elevator 启动参数的格式为:

elevator=schedulerName

其中,schedulerNamedeadlinenoopcfq。可使用引导装载程序(在最近的 Linux 发行版中为 grub 或 grub2)设置驱动参数。有关如何添加内核启动参数的详细信息,请参见相应发行版的文档。