linux i/o scheduler
DESCRIPTION
Linux I/O Scheduler ShareTRANSCRIPT
![Page 1: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/1.jpg)
HeseyWang
Linux I/O Scheduler
![Page 2: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/2.jpg)
访问磁盘的过程
![Page 3: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/3.jpg)
访问磁盘的过程
• 寻道时间 Server: 3ms Common: 10ms
• 旋转延迟 平均半圈
• 存取时间=平均寻道时间+平均旋转延迟
• 数据读取时间 <1ms,忽略丌计
• 影响IOPS的主要因素:寻道时间
Typical HDD figures
HDD Spindle [rpm]
Average rotational latency [ms]
4,200 7.14
5,400 5.56
7,200 4.17
10,000 3.00
15,000 2.00
![Page 4: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/4.jpg)
SAS
15K RPM IOPS: ~180 SATA II
7200 RPM IOPS: ~90
![Page 5: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/5.jpg)
SATA II
Intel X25-M IOPS: ~8600
![Page 6: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/6.jpg)
访问磁盘的过程
• 如何让磁盘读写更快 减少寻道时间(避免磁头移动开销) 让磁头旋转一圈读写更多相邻扇区的数据(顺序读写)
![Page 7: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/7.jpg)
扇区
• 操作系统视角 逻辑块序列
• 硬件视角 物理扇区
• 磁盘控制器 映射「逻辑块」->实际物理扇区
![Page 8: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/8.jpg)
读取一个扇区
• CPU->磁盘控制器 读某个逻辑块号
• 磁盘控制器 快速表搜索 逻辑块号->(盘面,磁道,扇区)三元组,唯一标示物理扇区
• 机械移动(寻道、旋转)
• 拷贝主存
![Page 9: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/9.jpg)
• I/O调度器的层级结构
![Page 10: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/10.jpg)
I/O子系统
![Page 11: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/11.jpg)
Block I/O Layer
![Page 12: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/12.jpg)
I/O调度器
• 目标 减少寻道时间,让旋转一圈读取更多扇区
• 任务 1、管理块设备请求队列 2、分配I/O资源给请求
• 做法 合并 + 排序
![Page 13: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/13.jpg)
合并
• 同一或多个相邻扇区的请求 —— 合并 ——> 一次I/O
• 一次I/O对应一条寻址指令
• 减少系统开销和寻址次数
![Page 14: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/14.jpg)
排序
• I/O请求按照扇区增长排列
• Sorted Queue
![Page 15: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/15.jpg)
•几种I/O调度器
![Page 16: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/16.jpg)
Linus电梯
• 简单的合并+排序
• 避免请求饥饿 梱测到队列中有长期没有被处理的请求,那么就暂时中止插入
• 缺点 I/O调度器并没有真正去处理饥饿请求,而是采取了一种间接的方式,所以很有可能饥饿的请求依旧饥饿,并没有解决实质问题
![Page 17: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/17.jpg)
Deadline
• 带超时的调度算法
• 3个I/O Queue Read Queue(default timeout: 500ms) FIFO Write Queue(default timeout: 5000ms) FIFO Sorted Queue
• 缺点 当系统存在大量顺序请求时,可能导致请求无法被很好地排序,引发频繁寻道,比较适合随机访问多、时效性高的场景
![Page 18: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/18.jpg)
Deadline
• 权衡了全局吞吐量和系统延迟
• 请求同时插入Read/Write Queue和Sorted Queue
• writes_starved 避免写饥饿,当写饥饿次数达到writes_starved,写请求会被立即处理
![Page 19: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/19.jpg)
Anticipatory (AS)
• 2.6.18之前默认的I/O调度器 基于预测算法 主要是为了解决Deceptive idleness问题
• 处理完一个请求,丌直接处理下一个请求,而是针对上一个请求的进程等待片刻,如果该进程发出一个不当前扇区相同或相邻扇区的请求,则优先处理
• 默认等待6ms
• 如果系统存在大量相邻扇区请求,性能会很好
![Page 20: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/20.jpg)
CFQ
• 2.6.18之后默认的I/O调度器 每个提交I/O请求的进程都有一个自己单独的Sorted Queue
• 在一个时间片中,CFQ调度器选择一个进程,处理其I/O队列
• 丌是简单的轮询,基于红黑树选择进程(进程优先级)
• 特点是保证各个进程的I/O请求能被均衡处理
• 也有类似AS的等待机制
• QUEUE_FLAG_NONROT
![Page 21: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/21.jpg)
NOOP
• 面向随机访问设备(例如SSD)
• 我们只做合并,元芳,你怎么看?
• 对于SSD 选择NOOP还是Deadline? Deadline平衡读写比例
![Page 22: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/22.jpg)
Benchmark
Red Hat Enterprise Linux 4 I/O schedulers vs. Red Hat Enterprise Linux 3 for database Oracle 10G oltp/dss (relative performance)
![Page 23: Linux I/O Scheduler](https://reader034.vdocuments.site/reader034/viewer/2022042518/559331291a28ab1e648b4707/html5/thumbnails/23.jpg)
谢谢!