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资源控制。

E、总结

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

原文地址:https://blog.51cto.com/darren88/2407895

时间: 2024-11-09 05:06:26

Linux磁盘IO调度算法的相关文章

Linux deadline io 调度算法

deadline算法的核心就是在传统的电梯算法中加入了请求超时的机制,该机制主要体现在两点: 1.请求超时时,对超时请求的选择. 2.没有请求超时时,当扫描完电梯最后一个request后,准备返回时,对第一个request的选择.基于以上两点,平衡了系统i/o吞吐量和响应时间. 此外,该算法还考虑到了读操作对写操作造成的饥饿. 定义了elevator_deadline调度器类型: static struct elevator_type iosched_deadline = { .ops = {

Linux磁盘IO监控[zz]

磁盘 I/O 监控是 Unix/Linux 系统管理中一个非常重要的组成部分.它可以监控吞吐量.每秒 I/O 数.磁盘利用率.服务时间等信息,并且在发现异常时,发送告警信息给系统管理员,便于系统管理员进行调整数据布局等管理活动以达到优化系统总体性能的目的. 不同的操作系统监控磁盘 I/O 的命令可能略有不同.本文将介绍 Unix/Linux 操作系统磁盘 I/O 管理命令及相关信息,并讲述 Unix/Linux 操作系统上磁盘 I/O 管理监控的自动化脚本实现. Unix/Linux 磁盘 I/

linux块设备的IO调度算法和回写机制

************************************************************************************** 參考: <Linux内核设计与实现> http://laokaddk.blog.51cto.com/368606/699028/ http://www.cnblogs.com/zhenjing/archive/2012/06/20/linux_writeback.html *************************

linux的cpu和磁盘io优先级设置

通常linux下限制cpu使用有三种方法: nice/renice:调整进程使用cpu的优先级 cpulimit:不修改进程的nice值,通过暂停进程一段时间,来限制cpu使用 cgroups:内核提供的机制,可以限制.记录.隔离一组进程所使用的cpu.内存.磁盘.网络等资源,是docker等容器的基础技术之一 限制磁盘io : ionice : 调整io调度的优先级 cgroups 这里只说nice和ionice,实际上nice和ionice只是改变优先级,并没有真正的限制 一.nice 1.

Linux服务器用iotop命令分析服务器磁盘IO情况

Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦.如果会systemtap, 或者blktrace这些事情难不到大家, 但是没专用工具总不是很舒服的. 幸运的是Linux 2.6.20内核以后提供了基于每个进程的IO记账功能,所以就有了类似iotop这样方便的工具.可以通过iotop工具进行分析,查看哪个进程占有读写比较高. 官网地址: http://guichaz.free.fr/iotop/ Iot

Linux运维 第三阶段(8) 磁盘IO性能监控 iostat

Linux下的iostat命令 #iostat -d -k -t 2 -d:显示系统中的设备 -k:表示以每秒kb的形式显示 -t:打印出时间信息 2:表示每2秒统计一次 每次输出都会打印时间信息, 接下来显示磁盘IO情况列表. Device: 显示磁盘名称tps: 表示每秒钟输出到物理磁盘的传输次数.一次传输就是一个对物理磁盘的 I/O 请求.多个逻辑请求可被并为对磁盘的一个单一 I/O 请求.传输具有中等的大小.kB_read/s: 每秒从磁盘读取的数据量,单位为KB.kB_wrtn/s:

Linux下java获取CPU、内存、磁盘IO、网络带宽使用率

一.CPU 使用proc文件系统,"proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数." 从/proc文件系统获取cpu使用情况:    cat /proc/stat 在Linux的内核中,有一个全 局变量:Jiffies. Jiffies代表时间.它的单位随硬件平台的不同而不同.系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目.这样ji

linux性能优化cpu 磁盘IO MEM

系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上的优化就适合眼下正在运行的系统,不同的系统.不同的硬件.不同的应用优化的重点也不同. 优化的方法也不同.优化的参数也不同.性能监测是系统优化过程中重要的一环,如果没有监测.不清楚性能瓶颈在哪里,怎么优化呢?所以找到性能 瓶颈是性能监测的目的,也是系统优化的关键.系统由若干子系统构成,通常修改一个子系

linux查看磁盘io的几种方法

怎样才能快速的定位到并发高是由于磁盘io开销大呢?可以通过三种方式: 第一种:用 top 命令 中的cpu 信息观察 Top可以看到的cpu信息有: Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si 具体的解释如下: Tasks: 29 total 进程总数 1 running 正在运