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

#### 原理

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

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

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

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

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


#### 使用方法

执行以下命令查看当前的调度方式。

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

其中，“[ ]”中即为当前使用的磁盘IO调度模式。

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


如果需要修改，可以采用echo来修改。

比如执行以下命令将sda的调度模式修改为“deadline”。

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

如果HPC程序并不使本地盘进行IO读写，可以跳过此步骤。
