23
HeseyWang Linux I/O Scheduler

Linux I/O Scheduler

  • Upload
    hesey

  • View
    1.436

  • Download
    5

Embed Size (px)

DESCRIPTION

Linux I/O Scheduler Share

Citation preview

Page 1: Linux I/O Scheduler

HeseyWang

Linux I/O Scheduler

Page 2: Linux I/O Scheduler

访问磁盘的过程

Page 3: 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

Page 4: Linux I/O Scheduler

SAS

15K RPM IOPS: ~180 SATA II

7200 RPM IOPS: ~90

Page 5: Linux I/O Scheduler

SATA II

Intel X25-M IOPS: ~8600

Page 6: Linux I/O Scheduler

访问磁盘的过程

• 如何让磁盘读写更快 减少寻道时间(避免磁头移动开销) 让磁头旋转一圈读写更多相邻扇区的数据(顺序读写)

Page 7: Linux I/O Scheduler

扇区

• 操作系统视角 逻辑块序列

• 硬件视角 物理扇区

• 磁盘控制器 映射「逻辑块」->实际物理扇区

Page 8: Linux I/O Scheduler

读取一个扇区

• CPU->磁盘控制器 读某个逻辑块号

• 磁盘控制器 快速表搜索 逻辑块号->(盘面,磁道,扇区)三元组,唯一标示物理扇区

• 机械移动(寻道、旋转)

• 拷贝主存

Page 9: Linux I/O Scheduler

• I/O调度器的层级结构

Page 10: Linux I/O Scheduler

I/O子系统

Page 11: Linux I/O Scheduler

Block I/O Layer

Page 12: Linux I/O Scheduler

I/O调度器

• 目标 减少寻道时间,让旋转一圈读取更多扇区

• 任务 1、管理块设备请求队列 2、分配I/O资源给请求

• 做法 合并 + 排序

Page 13: Linux I/O Scheduler

合并

• 同一或多个相邻扇区的请求 —— 合并 ——> 一次I/O

• 一次I/O对应一条寻址指令

• 减少系统开销和寻址次数

Page 14: Linux I/O Scheduler

排序

• I/O请求按照扇区增长排列

• Sorted Queue

Page 15: Linux I/O Scheduler

•几种I/O调度器

Page 16: Linux I/O Scheduler

Linus电梯

• 简单的合并+排序

• 避免请求饥饿 梱测到队列中有长期没有被处理的请求,那么就暂时中止插入

• 缺点 I/O调度器并没有真正去处理饥饿请求,而是采取了一种间接的方式,所以很有可能饥饿的请求依旧饥饿,并没有解决实质问题

Page 17: Linux I/O Scheduler

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

Deadline

• 权衡了全局吞吐量和系统延迟

• 请求同时插入Read/Write Queue和Sorted Queue

• writes_starved 避免写饥饿,当写饥饿次数达到writes_starved,写请求会被立即处理

Page 19: Linux I/O Scheduler

Anticipatory (AS)

• 2.6.18之前默认的I/O调度器 基于预测算法 主要是为了解决Deceptive idleness问题

• 处理完一个请求,丌直接处理下一个请求,而是针对上一个请求的进程等待片刻,如果该进程发出一个不当前扇区相同或相邻扇区的请求,则优先处理

• 默认等待6ms

• 如果系统存在大量相邻扇区请求,性能会很好

Page 20: Linux I/O Scheduler

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

NOOP

• 面向随机访问设备(例如SSD)

• 我们只做合并,元芳,你怎么看?

• 对于SSD 选择NOOP还是Deadline? Deadline平衡读写比例

Page 22: Linux I/O Scheduler

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

谢谢!