调整Linux I/O调度器优化性能

Adjustment Linux I/O Scheduler Optimize Performance

  linkthis    2018-06-12    1575 words

Linux I/O 调度器是Linux内核中的一个组成部分,用户可以通过调整这个调度器来优化系统性能。

Linux I/O调度器

目前主流的Linux发行版本一般提供以下三种I/O调度器,下面进行简单的介绍:

CFQ

CFQ全称Completely Fair Scheduler,中文名称完全公平调度器,它是目前多数Linux发行版默认使用的调度器,其由内核默认选择。CFQ将由进程提交的同步请求放到多个进程队列中,然后为每个队列分配时间片以访问磁盘。对于通用的服务器是最好的选择,CFQ均匀地分布对I/O带宽的访问。CFQ为每个进程和线程,单独创建一个队列来管理该进程所产生的请求,以此来保证每个进程都能被很好的分配到I/O带宽,I/O调度器每次执行一个进程的4次请求。该算法的特点是按照I/O请求的地址进行排序,而不是按照先来后到的顺序来进行响应。简单来说就是给所有同步进程分配时间片,然后才排队访问磁盘。

DeadLine

Deadline为截止时间调度器,是对Linus Elevator的一种改进(在2.4内核中使用的第一种I/O调度器。主要作用是为每个设备维护一个查询请求,当内核收到一个新请求时,如果能合并就合并。如果不能合并,就会尝试排序。如果既不能合并,也没有合适的位置插入,就放到请求队列的最后),可以避免有些请求太长时间不能被处理,并可以区分对待读操作和写操作。Deadline分别额外为读I/O和写I/O提供了FIFO队列。
在Debian9系统下,如果使用官方提供的4.16版本内核,将会同时默认启用mq-deadline,其可以并行执行I/O调度,提高执行效率。

NOOP

NOOP全称No Operation,中文名称电梯式调度器,其实现了最简单的FIFO队列,所有I/O请求大致按照先来后到的顺序进行操作。NOOP实现了一个简单的FIFO队列,像电梯的工作主法一样对I/O请求进行组织。它是基于先入先出(FIFO)队列概念的Linux内核里最简单的I/O调度器。此调度程序比较适合固态硬盘。

查看使用的I/O调度器调整

查看系统支持的I/O调度器:

1
2
3
4
dmesg | grep -i scheduler
[    1.092429] io scheduler noop registered
[    1.092431] io scheduler deadline registered
[    1.092582] io scheduler cfq registered (default)

结果显示,CFQ是目前使用的I/O调度器。
查看某块硬盘使用的I/O调度器:

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

结果显示,CFQ是此硬盘使用的I/O调度器。
注意,此命令在VPS上可能无法执行。

修改使用的I/O调度器

修改linux的调度器十分简单,可以通过shell命令或者修改grub配置文件来达到目的。

Shell

此方法可以随时更改I/O调度器而无需重启计算机。

1
echo deadline > /sys/block/sda/queue/scheduler

注意,此命令在VPS上可能无法执行。

GRUB

此方法将永久修改默认的I/O调度器,与使用shell命令的临时修改不同,系统重启后,修改的调度器不会失效。 修改/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT内增加:

1
elevator=deadline

保存之后执行update-grub命令,然后重启计算机即可。

用户需要根据自己的需求来选择适合自己使用环境的I/O调度器,每种调度器只有在合适的硬件上才能发挥最优的效果。
本文采用CC BY-NC-ND 4.0许可协议进行许可,转载请注明出处。

本文最后更新时间为:2019-02-03-Sunday-03:22:20 PM




Image of Wechat