银河麒麟服务器系统修改磁盘I/O调度算法

磁盘调度算法

一 常见的I/O调度算法

1、 单队列(single-queue) I/O调度算法
1.1 NOOP(电梯式调度程序)

介绍:
在Linux2.4或更早的版本中调度算法只有NOOP这一种。NOOP实现了一个简单的FIFO队列,它像电梯的工作方法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质。NOOP执行I/O请求的合并,但不进行排序,并且NOOP在请求上倾向于饿死读而利于写。

适用范围:
随机访问设备(闪存、RAM等)和嵌入式系统。

知识扩展:
**电梯算法饿死读请求:**因为写请求比读请求更容易.写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到I/O队列中.读请求需要等到它前面所有的读操作完成,才能进行下一次读操作.在读操作之间有几毫秒时间,而写请求在这之间就到来,饿死了后面的读请求.

1.2 Deadline(截止时间调度程序)

介绍:
Deadline确保了在一个截止时间内的服务请求,这个截止时间是可调整的,而默认读期限短于写期限。这样就防止了写操作因为不能被读取而饿死的现象。并且Deadline使用3个队列处理I/O请求:

​ ·排序
​ ·Read FIFO—按时间顺序存储的读取请求
​ ·Write FIFO—按时间顺序存储的写入请求

请求是从排序队列发出的,除非读或写FIFO头的读取过期,否则读请求优先于写请求。读取请求的过期时间为500毫秒,写入请求的过期时间为5秒。

适用范围:
数据库环境(ORACLE RAC,MYSQL等)

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

介绍:

CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程为一个队列,同时为每个队列分配一个时间片以进行公平排队。如果时间片量没有过期,可能会浪费空闲时间。

适用范围:

通常为系统默认算法

2、 多队列(multi-queue) I/O调度算法
2.1 BFQ(Budget Fair Queueing)

介绍:
BFQ的出现以取代CFQ为目标,大部分代码借鉴于CFQ,可以说BFQ是CFQ的升级版。BFQ主旨在提供良好的交互响应,特别是对于速度较慢的I/O设备。这是一个复杂的I/O调度程序,每个操作的开销相对较高,因此对于CPU速度较慢的设备或高吞吐量I/O设备来说并不理想。BFQ是一个按比例共享存储资源的I/O调度器,,除了支持cgroups(blkio或者io控制器)之外,BFQ的主要功能还包括:

​ ·与CFQ按时间片分配带宽不同,BFQ按预算(服务数据量,扇区为单位)在进程或者组之间分配带宽(在需 要时切换回时间分配,以保持高吞吐量);

​ ·保证对系统和应用程序的快速响应,以及软实时应用程序(如音视频播放器)的低推迟。

适用范围:
适用于支持多队列算法的个人和服务器系统,通常为系统默认算法。

2.2 mq-deadline

介绍:

Mq-deadline是对截止期I/O调度程序的一种自适应,是对deadline算法的升级完善,算法用于多队列设备。在一个相对较低的CUP 上也能发挥的很全面。

适用范围:

数据库环境(ORACLE RAC,MYSQL等)。

2.3 Kyber

介绍:

Kyber相对简单,有两个请求队列:

​ ·同步请求(例如阻止的读取)

​ ·异步请求(例如写入)

对发送到队列的请求操作的数量有严格的限制。从理论上讲,这限制了等待调度请求的时间,因此应该为高优先级的请求提供快速完成时间。

适用范围:

用于快速多队列设备

#注:大多数系统支持以上所有算法,但系统自带算法一般只有一套(单队列算法或多队列算法),麒麟V10系统自带多队列算法,V10以下系统自带且仅支持单队列算法。

二 关于I/O调度算法的操作

1、查看当前系统支持的算法
[root@localhost ~]#  dmesg | grep -i scheduler
[    2.364245] io scheduler noop registered
[    2.364245] io scheduler deadline registered
[    2.364285] io scheduler cfq registered
[    2.364285] io scheduler mq-deadline registered
[    2.364286] io scheduler kyber registered
[    2.364341] io scheduler bfq registered (default)
2、查看系统当前I/O调度算法
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
mq-deadline kyber [bfq] none
3、 临时修改系统I/O调度算法

例:I/O调度算法修改为deadline

[root@localhost ~]# echo deadline > /sys/block/sda/queue/scheduler

查看修改

[root@localhost ~]# cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none
4、 永久修改I/O调度算法(以修改mq-deadline为例)

(1)当systemd版本为systemd-243-27.oe1之前的版本,想要永久修改I/O调度策略,可以修改/lib/udev/rules.d/60-block-scheduler.rules规则,将ATTR{queue/scheduler}="bfq"改为 ATTR{queue/scheduler}=“mq-deadline”,重启后生效。

# do not edit this file, it will be overwritten on update
ACTION=="add", SUBSYSTEM=="block", \
 KERNEL=="mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|sd*[!0-9]|sr*", \
 ATTR{
    
    queue/scheduler}="mq-deadline"

(2)当systemd版本为systemd-243-27.oe1以及之后的版本,可以通过在内核启动配置文件grub.cfg中的kernel行追加:elevator=mq-deadline,重启后生效。

linux  /vmlinuz-4.19.90-2003.4.0.0036.oe1.x86_64 root=/dev/mapper/openeuler-root ro resume=/dev/mapper/openeuler-swap rd.lvm.lv=openeuler/root rd.lvm.lv=openeuler/swap quiet crashkernel=512M elevator=mq-deadline

猜你喜欢

转载自blog.csdn.net/weixin_45754407/article/details/131594113