输入/输出调度器
输入/输出调度器位于 Linux 操作系统中,用于排序和合并输入/输出请求,并决定这些请求的处理顺序。
输入/输出调度器尤其适用于磁盘驱动器等设备,因为此类设备可能需要在查找时间上花费非常昂贵的成本,并且其最适合合并同地协作的请求。输入/输出调度器对固态设备和虚拟化环境的影响较小。这是因为对于固态设备而言,顺序访问与随机访问没有区别,而对于虚拟化环境,则由主机提供自定义的调度层。
本主题将就 Amazon Linux 输入/输出调度器进行讨论。有关其它 Linux 发行版使用的输入/输出调度器的更多信息,请参阅其文档。
支持的调度器
Amazon Linux 支持以下输入/输出调度器:
-
deadline
– 截止日期输入/输出调度器会对输入/输出请求进行排序,并以最有效的顺序进行处理。其保证了每个输入/输出请求的开始时间。其还会为等待时间过长的输入/输出请求提供更高的优先级。 -
cfq
– 完全公平队列 (CFQ) 输入/输出调度器会试图在进程之间公平分配输入/输出资源。其会对输入/输出请求进行排序并将其插入到每个进程队列之中。 -
noop
– 无操作 (noop) 输入/输出调度器会将所有输入/输出请求插入到 FIFO 队列之中,然后将其合并至单个请求。此调度器不会排序任何请求。
默认调度器
无操作 (noop) 是 Amazon Linux 的默认输入/输出调度器。使用此调度器的原因如下:
-
许多实例类型都使用虚拟化设备,其中底层主机会为实例执行调度。
-
许多实例类型都使用固态设备,而输入/输出调度器的不会在此情况下体现出明显优势。
-
该调度器是侵入性最小的输入/输出调度器,且可以根据需要进行自定义设置。
更改调度器
根据调度器能否在给定时间内完成更多或更少的输入/输出请求,更改输入/输出请求者可以提高或降低性能。这在很大程度上取决于您的工作负载、正在使用的实例类型的生成以及正在访问的设备的类型。若要更改正在使用的输入/输出调度器,我们建议您使用工具(例如 iotop)来衡量输入/输出的性能并确定此更改是否有益于您的使用场景。
您可以使用以下命令来查看设备的输入/输出调度器,例如 nvme0n1
。将以下命令中的 nvme0n1
替换为您实例上的 /sys/block
中列出的设备。
$
cat /sys/block/nvme0n1
/queue/scheduler
请使用以下命令为设备设置输入/输出调度器。
$
echocfq|deadline|noop
> /sys/block/nvme0n1
/queue/scheduler
例如,要将 xvda
设备的输入/输出调度器设置为从 noop
到 cfq
,请使用以下命令。
$
echocfq
> /sys/block/xvda
/queue/scheduler