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