---
title: 优化磁盘I/O调度方式
description: "文件系统在通过驱动读写磁盘时，不会立即将读写请求发送给驱动，而是延迟执行，这样Linux内核的I/O调度器可以将多个读写请求合并为一个请求或者排序（减少机械磁盘的寻址）发送给驱动，提升性能。我们在前文介绍工具iostat时，也提到了合并的统计，这个值就是由这个过程统计获得。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0040.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0040.html
indexId: ee405445645be63a49738ddac9791c6d998bf3ff212aa7a2ae04558e5286dc7858
---
# 优化磁盘I/O调度方式

#### 原理

文件系统在通过驱动读写磁盘时，不会立即将读写请求发送给驱动，而是延迟执行，这样Linux内核的I/O调度器可以将多个读写请求合并为一个请求或者排序（减少机械磁盘的寻址）发送给驱动，提升性能。我们在前文介绍工具iostat时，也提到了合并的统计，这个值就是由这个过程统计获得。

目前Linux版本主要支持3种调度机制：

1. CFQ，完全公平队列调度
  是早期Linux内核的默认调度算法，它给每个进程分配一个调度队列，默认以时间片和请求数限定的方式分配I/O资源，以此保证每个进程的I/O资源占用是公平的。这个算法在I/O压力大，且I/O主要集中在某几个进程的时候，性能不太友好。

2. DeadLine，最终期限调度
  这个调度算法维护了4个队列，分别为读队列、写队列、超时读队列和超时写队列。当内核收到一个新请求时，如果能合并就合并，如果不能合并，就会尝试排序。如果既不能合并，也没有合适的位置插入，就放到读或写队列的最后。一定时间后， I/O调度器会将读或写队列的请求分别放到超时读队列或者超时写队列。这个算法并不限制每个进程的I/O资源，适合I/O压力大且I/O集中在某几个进程的场景，比如大数据、数据库使用HDD磁盘的场景。

3. NOOP，也叫NONE，是一种简单的FIFO调度策略
  因为固态硬盘支持随机读写，所以固态硬盘可以选择这种最简单的调度策略，性能最好。


#### 修改方式

查看当前的调度方式：

```
cat /sys/block/$DEVICE-NAME/queue/scheduler
noop deadline [cfq]
```

[]中为当前使用的磁盘I/O调度模式。

操作系统不同，返回的值或默认值可能不同。


如果需要修改，可以采用echo来修改，例如将sda修改为“deadline”：

```
echo deadline > /sys/block/sda/queue/scheduler
```
