Linux的IO调度程序
Linux的IO调度机制浅析
现代计算机体系中,磁盘的速度和CPU的速度差距太大了,如果简单的将系统的IO请求按照请求的顺序进行顺序处理的话,系统的IO开销将导致系统的效率十分的低下,因此就需要将IO请求进行合理的安排,Linux系统在这一方面主要通过两种机制实现其一是各种层次的缓存,然后就是IO调度。IO调度的算法和磁盘的寻址原理无法分离,所以先简单看一下磁盘寻址原理,这个百度一下就可以找到很多这里就是简单说下。
磁盘寻址
常见的硬盘都是由许多个盘片组成重叠同心圆盘,每一个磁盘由磁盘、磁轴和读写头组成,要在硬盘上找到一个准确的地址需要磁柱(cylinder)、磁头(head)和扇区(sector)三个坐标这就是CHS寻址。而且现代的磁盘这部分的工作是由硬盘的固件完成的,硬盘固件接受逻辑块号由固件将逻辑块到chs进行一一映射,而操作系统访问采用块编号访问磁盘的特定地址,这就是逻辑块寻址(LBA),并且逻辑块的编号到硬盘CHS的映射往往也是顺序的。
所以起初的IO调度程序主要的任务就是减少磁头移动的距离,就如同一个快递员在城市中派送快递一样,他会安排一个合理的顺序去派件,同一个小区的快件会在一次派件时一起完成。反应在IO调度程序中就是合并和排序。合并就是将一个小区的快递从中转站全部集中来;排序就是对派送顺序的优化安排,就是尽量的减少派送总距离从而提高自己的派送效率。这个原理同电梯的调度相同,所以最早的IO调度算法本称为“电梯算法”。其原理就是保证磁头的线性移动,就像电梯会是 1、3、4、5、8、9或9、7、5、3、2、1 这样的顺序停止,虽然可能3楼的人后按了楼层按键。这个算法有个明显的问题就是如果不停的有新的物理顺序靠前的IO请求到来将导致靠后的请求被长时间的等待。然后就有了新的IO调度程序来解决以上问题以优化性能。
Deadline IO调度
同电梯算法比,此机制保留了IO请求的排序后的IO请求队列,额外的引进了两个队列均按请求时间的前后排序,一个为读请求,一个为写请求。一个新的请求到来时会按顺序的先放到标准队列中合适的位置,而再根据操作类型不同放到新增读写队列其中一个的末尾,读和写队列有着不同的IO请求deadline时间限制,一般读为500ms,写为5秒。然后此时IO调度程序平时行为就如同前面的调度算法一样从标准队列中一个个的按顺序处理,不同的是当读或写队列中任何一个请求deadline时间到来时,就会转而服务这个到期的请求,从而解决电梯算法的“饿着”某些请求的问题。
Anticipatory IO调度
此调度算法也是针对Deadline IO调度算法的一种优化,因为在Linux下读取操作是同步且同步化的,只有前一个读取请求返回了才可以送出下一个读请求,所以deadlineIO调度会有一个糟糕情况就是,当由一系列的物理相关的读请求出现时(从应用分析这种场景还比较常见)就会出现续读写头来回运动的情况,因为当第一个读请求送出并到期IO调度磁头需要先服务于这请求,然后回去继续普通的IO请求,此时与之前的读相邻的第二个读请求又来了,但是此时读写头已经运动回正常队列的请求地址了,然后等这个读请求到期就会发生和第一个读请求一样的情况了,所以如果正常队列的IO请求与当前请求的物理位置差的很远的话,这就是deadline算法的最坏情况,所以就有了Anticipatory IO调度算法,他的机制也很简单,在服务完一个到期的读时进行一个合适的时间等待,如果新提交的读请求来到就可以快速完成读,正如其名是一个预测性质的算法是概率学优化。
CFQ IO调度
称为完全公平调度算法,它为每个进程维护了一个IO请求队列,IO调度程序会以轮询的方式服务每个进程队列的请求,直到时间片用完或者无IO请求,对于后者情况IO调度将等待一个合适的时间(10ms)再无请求到来时进行下一个队列的服务,并且它会使读取请求优先执行,因为进程地址空间对应到物理空间的局部性,这个算法在避免“饿着”某一个IO请求的前提下保证了整体性能。
NOOP IO调度
这是一个针对非机械硬盘寻址机制出现的IO调度算法,比如固态硬盘,因为没有的机械动作的缘故,所以noop IO调度算法仅仅进行IO请求的合并而不进行排序,这种算法的效率简单且高效,但他依赖于物理设备。
查看和设置IO调度算法
IO调度算法的选择可以由内核启动参数传递设置,也可以通过/sys/block/device/queue/scheduler 获取当前IO调度算法和设置选择IO调度算法。除此之外还可以在用户空间优化IO的性能,这一部分就和应用的实现息息相关了,不过也常常就是三种方式,按路径,按inode,按物理块地址,因为常见文件系统会将同一路径的文件保存在物理地址相邻的地址中,Inode和物理块等都是一样的原理,就是将物理地址相邻的请求合并在一起交给内核,从而优化IO性能。
Linux的IO调度程序的更多相关文章
- Linux资源管理-IO优先级
前一篇博客介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法. 前提条件 如果想控制进程的IO优先级, 需要内核的支持, 内核编译 ...
- Linux硬件IO的优化简介
Linux硬件IO的优化简介 首先简单介绍下有哪些硬件设备如下(由于硬件种类厂家等各种因素我就不在此多做介绍有兴趣的可以自行学习): 1.CPU:中央处理器,是计算机运算控制的核心部件之一,相当于人的 ...
- linux标准io的copy
---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...
- MySQL 调优基础(四) Linux 磁盘IO
1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...
- Linux的io机制
Linux的io机制 Buffered-IO 和Direct-IO Linux磁盘I/O分为Buffered IO和Direct IO,这两者有何区别呢? 对于Buffered IO: 当应用程序尝试 ...
- Linux Network IO Model、Socket IO Model - select、poll、epoll
目录 . 引言 . IO机制简介 . 阻塞式IO模型(blocking IO model) . 非阻塞式IO模型(noblocking IO model) . IO复用式IO模型(IO multipl ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 转:Linux网络IO并行化技术概览
转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...
- Linux的IO调度
Linux的IO调度 IO调度发生在Linux内核的IO调度层.这个层次是针对Linux的整体IO层次体系来说的.从read()或者write()系统调用的角度来说,Linux整体IO体系可以分为七层 ...
随机推荐
- 理解Go的多态实现
总结两点: 在Go中,定义一个interface类型,该类型说明了它有哪些方法.使用时,在函数中,将该interface类型作为函数的形参,任意一个实现了interface类型的实参都能作为该inte ...
- 运用 pyinstaller 打包的python exe文件运行 去掉命令行窗口及其他参数汇总
运行exe文件的时候,会弹出一个dos命令窗口,这个窗口可以看到一些打印信息,如果想只运行tkinter 页面,去掉dos窗口需要在打包的时候 加上 -w 参数 pyinstaller -F XX.p ...
- apscheduler(定时任务) 基于redis持久化配置操作
apscheduler(定时任务) 基于redis持久化配置操作 安装模块 pip install apscheduler 导入模块配置 ## 配置redis模块 from apscheduler.j ...
- 手写Netty之多路复用Select小案例
注意:本文只是将上文多路复用器Select.Poll.Epoll区别梳理中提出的概念与Netty中的步骤联系起来,方便后面回顾,代码中注释很多,对于大家来说如果不是怀有同样的目的,不一定有用. 单线程 ...
- C++ Primer Plus读书笔记(二)处理数据
1.格式化输出: 和C语言不太一样,C++格式化输出进制格式如下: 1 int a = 42; 2 int b = 42; 3 int c = 42; 4 5 cout << a < ...
- Jenkins入门教程
Jenkins入门教程 @ 目录 Jenkins入门教程 1. 什么是Jenkins 1.1 我们为啥需要jenkins 1.2. Jenkin实现原理 2. Jenkins搭建 2.1. Jenki ...
- web.xml 监听器
一.作用 Listener就是在application,session,request三个对象创建.销毁或者往其中添加修改删除属性时自动执行代码的功能组件. Listener是Servlet的监听器, ...
- wmi_exporter+Prometheus+Grafana
wmi_exporter+Prometheus+Grafana 原文地址: CSDN:NRlovestudy:Windows 下搭建 wmi_exporter+Prometheus+Grafana 服 ...
- Go语言学习笔记(2)——零散的话题(反射)
这部分是<Go语言编程>这本书的第9章的内容.书中给该章节的定位是一个文章集,其包含了一些Go语言中比较少涉及,或是比较深入的讨论的内容.因为第一节就是反射,而反射在我看来是比较重要的内容 ...
- Spring5源码,@ModelAttribute
一.什么是@ModelAttribute注解 二.@ModelAttribute注解相关代码详解 一.什么是@ModelAttribute注解 @ModelAttribute注解主要用来将请求转换为使 ...