`
j2002sx
  • 浏览: 34381 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

LINUX 的4中IO调度算法

阅读更多

IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯.(elevator)而相应的算法也就被叫做电梯算法.而Linux中IO调度的电梯算法有好几种,一个叫做as(Anticipatory),一个叫做cfq(Complete Fairness Queueing),一个叫做deadline,还有一个叫做noop(No Operation).具体使用哪种算法我们可以在启动的时候通过内核参数elevator来指定.
另一方面我们也可以单独的为某个设备指定它所采用的IO调度算法,这就通过修改在/sys/block/sda/queue/目录下面的scheduler文件.比如我们可以先看一下我的这块硬盘:
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
可以看到我们这里采用的是cfq.
 
2.6内核的四种调度算法
In the 2.6 kernel series, there are four interchangeable schedulers, as follows:
cfq- “Completely Fair Queuing” makes a good default for most workloads on general-purpose servers.
as - “Anticipatory Scheduler” is best for workstations and other systems with slow, single-spindle storage.
deadline - “Deadline” is a relatively simple scheduler which tries to minimize I/O latency by re-ordering requests to improve performance.
noop- “NOOP” is the most simple scheduler of all, and is really just a single FIFO queue.
修改默认的IO调度算法
There are two ways to change the I/O scheduler - at boot time, or with new kernels at runtime. For all Linux kernels, appending ‘elevator={noop|deadline}’ to the kernel boot string sets the I/O elevator.
With LILO, you can use the ‘append’ keyword:
image=/boot/vmlinuz-2.6.14.2
label=14.2
append=”elevator=deadline”
read-only
optional
With GRUB, append the string to the end of the kernel command:
title Fedora Core (2.6.9-5.0.3.EL_lustre.1.4.2custom)
root (hd0,0)
kernel /vmlinuz-2.6.9-5.0.3.EL_lustre.1.4.2custom ro
root=/dev/VolGroup00/LogVol00 rhgb noapic quiet elevator=deadline
With newer Linux kernels (Red Hat Enterprise Linux v3 Update 3 does not have this feature. It is present in the main Linux tree as of 2.6.15), one can change the scheduler while running. If the file /sys/block/<DEVICE>/queue/scheduler exists (where DEVICE is the block device you wish to affect), it will contain a list of available schedulers and can be used to switch the schedulers.
(hda is the <disk>):
[root@cfs2]# cat /sys/block/hda/queue/scheduler
noop [anticipatory] deadline cfq
[root@cfs2 ~]# echo deadline > /sys/block/hda/queue/scheduler
[root@cfs2 ~]# cat /sys/block/hda/queue/scheduler
noop anticipatory [deadline] cfq
The other schedulers (anticipatory and cfq) are better suited for desktop use.
查看当前系统支持的IO调度算法
dmesg | grep -i scheduler
cat /sys/block/sda/queue/scheduler ##查看系统使用的IO调度机制
noop anticipatory deadline [cfq]
其中用[ ]起来的,表示目前系统正使用的IO调弃机制,当前系统支持noop anticipatory deadline 和cfq
echo cfq >/sys/block/sda/queue/scheduler 来让更改及时生效
在2.6的内核中共计有4种IO调度机制:
1.Deadline scheduler Deadline scheduler 用 deadline 算法保证对于既定的 IO 请求以最小的延迟时间,从这一点理解,对于 DSS 应用应该会是很适合的。
2.Anticipatory scheduler(as) 曾经一度是 Linux 2.6 Kernel 的 IO scheduler 。Anticipatory 的中文含义是”预料的, 预想的”, 这个词的确揭示了这个算法的特点,简单的说,有个 IO 发生的时候,如果又有进程请求 IO 操作,则将产生一个默认的 6 毫秒猜测时间,猜测下一个 进程请求 IO 是要干什么的。这对于随即读取会造成比较大的延时,对数据库应用很糟糕,而对于 Web Server 等则会表现的不错。这个算法也可以简单理解为面向低速磁盘的,因为那个”猜测”实际上的目的是为了减少磁头移动时间。
3.Completely Fair Queuing  虽然这世界上没有完全公平的事情,但是并不妨碍开源爱好者们设计一个完全公平的 IO 调度算法。Completely Fair Queuing (cfq, 完全公平队列) 在 2.6.18 取代了 Anticipatory scheduler 成为 Linux Kernel 默认的 IO scheduler 。cfq 对每个进程维护一个 IO 队列,各个进程发来的 IO 请求会被 cfq 以轮循方式处理。也就是对每一个 IO 请求都是公平的。这使得 cfq 很适合离散读的应用(eg: OLTP DB)。我所知道的企业级 Linux 发行版中,SuSE Linux 好像是最先默认用 cfq 的.
4.NOOP Noop 对于 IO 不那么操心,对所有的 IO请求都用 FIFO 队列形式处理,默认认为 IO 不会存在性能问题。这也使得 CPU 也不用那么操心。当然,对于复杂一点的应用类型,使用这个调度器,用户自己就会非常操心。
 
redhat上介绍io调度算法的页面:

分享到:
评论

相关推荐

    Linux IO调度算法比较

    Linux IO调度算法比较

    英本linux IO调度算法之CFQ详解

    该文章有英本网资深讲师原创编写,介绍了linux I/O调度算法之CFQ

    Linux IO调度算法之CFQ详解.pdf

    CFQ调度是基于优先级调度的,系统中的每一个进程都有一个优先级类(这个优先级类关联了3种:实时(RT),最佳(BE),空闲),RT 和BE作为了一组8种不同的优先级来说明服务的不同优先级。 每一个进程都有有一个...

    Linux IO数据通道分享

    并根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的 IO 请求。 6.驱动层:驱动程序对应具体的物理块设备,它从上层中取出 IO 请求,并根据该 IO 请求中指定的信息,通过向具体块设备的设备控制器...

    linux IO优化

    Linux IO优化,调度算法 写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到I/O队列中. 读请求需要等到它前面所有的读操作完成,才能进行下一次读操作.在读操作之间有几毫秒...

    如何更改Linux 的I/O调度器?

     目前 Linux 上有如下几种 I/O 调度算法:  1、noop – 通常用于内存存储的设备。  2、cfq – 完全公平调度器。进程平均使用IO带宽。  3、Deadline – 针对延迟的调度器,每一个 I/O,都有一个晚执行时间。 ...

    Mysql运行环境优化(Linux系统)

    一、修改Linux默认的IO调度算法. linux默认的IO调度算法为cfq,需要修改为dealine,如果是SSD或者PCIe-SSD设备,需要修改为noop,可以使用下面两种修改方式。 1、在线动态修改,重启失效。 代码如下: echo “deadline” ...

    Java学习指南,涵盖大部分Java程序员所需要掌握的核心知识

    学习路线、Java基础...大厂面试爱问的「调度算法」,20 张图一举拿下 图解红黑树 面试必备 | 不可不会的反转链表 红黑树【图解】 算法学习工具网站 必会框架 Spring全家桶以及源码分析 SpringCloud 分布式框架基石-R

    【Java面试+Java学习指南】一部分大部分Java招聘所需要掌握的核心知识

    目录(善用Ctrl+F) 本人面试点合集 脑图在线编辑地址 学习路线 ...大厂面试爱问的「调度算法」,20张图一举拿下 图解红黑树 面试必备 | 不可能的食品链表 红黑树【图解】 改进学习工具网站 必会框架

    my-love:(都是脑图,建议使用xmind 8 :)工程师的自我修养->从linux,网络,MQ,Rpc,缓存,高可用架构,数据库,语言,全面成长,成为技术大神,优秀的工程师,自述文件,包括蚂蚁,头条,美团等面试思考(拿下要约)

    java /并发编程总结.pic_hd 质量管理体系如何快速整合团队架构-微服务 达博 IO多路收益系统编程和进度线程管理 未来发展信号和中断线程池的其他使用进度管理与调度算法 GC 管道与先进先出文件IO内存管理分散&& ...

    java开源包4

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    JAVA上百实例源码以及开源项目源代码

    Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四”...

    leetcode中国-myJavaNote:自己的java积累

    主要涉及操作系统的一些概念、基础知识等,如页面置换算法,进程调度算法等,这块自己也不太熟。还有Linux的一些常用操作做一个整理,发现很重要。 缓存 缓存这块是真的不熟,边学边整理 设计模式 设计模式也不熟,...

    wt1814.github.io:个人博客

    wt1814-笔记算法Java 设计模式虚拟机并发编程数据库SSM弹簧MyBatis分散分布式缓存雷迪斯 限流降级分布式消息数量卡夫卡 弹簧靴春云 达博 动物园管理员分散理论分散ID分散事务 分布式锁任务调度分布式搜索引擎分布式...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包11

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

Global site tag (gtag.js) - Google Analytics