29

Linux磁盘IO调度算法-0xsyshell

 4 years ago
source link: https://blog.51cto.com/darren88/2407895
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Linux磁盘IO调度算法

A、CFQ(完全公平排队I/O调度程序)

最新的内核版本和发行版中,都选择CFQ做为默认的I/O调度器,对于通用的服务器是最好的选择。

CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择。

CFQ赋予I/O请求一个优先级,而I/O优先级请求独立于进程优先级,高优先级的进程的读写不能自动地继承高的I/O优先级。

对于很多IO压力较大的场景就并不是很适应,尤其是IO压力集中在某些进程上的场景。因为这种场景我们需要更多的满足某个或者某几个进程的IO响应速度,而不是让所有的进程公平的使用IO,比如数据库应用。

CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,是deadline和as调度器的折中。

CFQ工作原理:

CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,每个队列按照上述规则进行merge和sort。

各队列之间的调度使用时间片来调度,以此来保证每个进程都能被很好的分配到I/O带宽,I/O调度器每次执行一个进程的4次请求。可以调queued和quantum来优化。

B、NOOP(电梯式调度程序)

在Linux 2.4或更早的版本的调度程序,那时只有这一种I/O调度算法,I/O请求被分配到队列,调度由硬件进行,只有当CPU时钟频率比较有限时进行。

Noop对所有的I/O请求都用FIFO队列形式处理,默认认为I/O不会存在性能问题。

CPU像电梯算法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质。

NOOP倾向饿死读而利于写,NOOP对于闪存设备,RAM,嵌入式系统是最好的选择。

电梯算法饿死读请求的解释:

因为写请求比读请求更容易,写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到I/O队列中。

读请求需要等到它前面所有的读操作完成,才能进行下一次读操作,在读操作之间有几毫秒时间,而写请求在这之间就到来,饿死了后面的读请求。

C、Deadline(截止时间调度程序)

Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限,这样就防止了写操作因为不能被读取而饿死的现象。

Deadline对数据库环境(ORACLE、MySQL等)是最好的选择。

Deadline实现了四个队列,其中两个分别处理正常read和write,按扇区号排序,进行正常IO的合并处理以提高吞吐量。

因为IO请求可能会集中在某些磁盘位置,这样会导致新来的请求一直被合并,于是可能会有其他磁盘位置的IO请求被饿死。

于是实现了另外两个处理超时read和write的队列,按请求创建时间排序,如果有超时的请求出现,就放进这两个队列,调度算法保证超时(达到最终期限时间)的队列中的请求会优先被处理,防止请求被饿死。

由于Deadline的特点,无法区分进程,也就不能实现针对进程的IO资源控制。

1.cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的调度算法,保证尽量公平。

2.deadline是一种以提高机械硬盘吞吐量为思考出发点的调度算法,只有当有IO请求达到最终期限的时候才进行调度,非常适合业务比较单一并且IO压力比较重的业务,比如数据库。

3.noop在固态硬盘这种场景下,使用noop是最好的,deadline次之,而cfq由于复杂度的原因,效率最低。

F、I/O调度方法的查看与设置

#查看操作系统版本

# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

#查看当前系统的I/O调度方法

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

#查看CentOS7下IO支持的调度

# dmesg | grep -i scheduler
[    1.018721] io scheduler noop registered
[    1.018725] io scheduler deadline registered (default)
[    1.018752] io scheduler cfq registered
[    1.018756] io scheduler mq-deadline registered
[    1.018759] io scheduler kyber registered

#临时更改I/O调度方法更改到cfq

# echo cfq > /sys/block/sda/queue/scheduler

#永久更改I/O调度方法
#修改内核引导参数,加入elevator=调度程序名
CentOS7:

# grubby --update-kernel=ALL --args="elevator=deadline"
# reboot
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq 

CentOS6:

# vim /boot/grub/menu.lst
更改到如下内容:
kernel /boot/vmlinuz-2.6.32-754.9.1.el6.x86_64 ro root=UUID=b7099316-3b2e-41c6-b5a4-1e5da27c8c48  elevator=deadline rhgb quiet

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK