【初心者向け】ディスク I/O のチューニング【５分で読める】

# ディスク I/O のチューニング

理解のために小咄形式でまとめました。


**登場人物**
- **太郎（後輩）**：入社1年目の若手エンジニア。
- **花子（先輩）**：システムエンジニア歴3年の先輩。

**場面：オフィスのチューニング作業中**
*太郎が `ionice` コマンドを試しながら、花子に質問する。*

**太郎**：「花子先輩、 `ディスク I/O のパフォーマンスチューニング` について調べてるんですが、 `OS の設定` や `ディスクのパラメータ` をどう調整すればいいのか、イメージが湧かなくて…。」

**花子**：「なるほどね。 `ディスク I/O のチューニング` では、大きく 3 つの領域に分けて考えると整理しやすいわ。それぞれの領域を説明するわね。」

---

### **ディスク I/O のチューニング**

**花子**：「`ディスク I/O のチューニング` は、大きく `3 つの領域` があるの。」

1. **OS のパラメータ**
2. **ディスクデバイスのパラメータ**
3. **ディスクコントローラのパラメータ**

**花子**：「チューニングは `システムの負荷を減らし、I/O を効率化する` のが目的よ。どのパラメータを調整できるかは、 `OS のバージョン` や `ディスクの種類` によって変わるから、それぞれのドキュメントを確認するのが基本ね。」

---

### **1. OS のパラメータ**
**花子**：「OS レベルでは、 `プロセスの I/O 優先度制御` や `I/O スケジューラの選択` などができるの。」

#### **1.1 ionice - I/O スケジューリング**
- Linux の `ionice` コマンドを使えば、 `プロセスの I/O 優先度` を制御できる。
- スケジューリングクラスは以下の 3 つ：
  - **0（なし）**: カーネルのデフォルト設定を使用。
  - **1（リアルタイム）**: 他のプロセスよりも優先して I/O を処理。
  - **2（ベストエフォート）**: 標準のスケジューリング、優先度を 0 〜 7 で設定。
  - **3（アイドル）**: 他の I/O がないときにのみ処理。

**太郎**：「例えば、`バックグラウンドのデータバックアップ` を `アイドルクラス` に設定すれば、 `通常の業務に影響を与えずに I/O を実行` できるってことですね！」

---

#### **1.2 I/O スケジューラの選択**
**花子**：「Linux には `複数の I/O スケジューラ` があるから、 `ワークロードに応じて最適なものを選ぶ` のがポイントね。」

- **`none`（NVMe 専用）** → **低遅延、オーバーヘッドが少ない**
- **`mq-deadline`（デフォルト）** → **バランス型、HDD/SSD 向け**
- **`bfq`（デスクトップ向け）** → **インタラクティブなレスポンスを重視**
- **`kyber`（データセンター向け）** → **SSD 向け、キューの制御が可能**

**太郎**：「ってことは、 `データベースサーバーの NVMe SSD` なら `none`、 `一般的な HDD` なら `mq-deadline` を選ぶのが良さそうですね！」

---

### **2. ディスクデバイスのパラメータ**
**花子**：「ディスク自体の設定も、 `I/O の効率化` に影響を与えるの。」

#### **2.1 先読み（read-ahead）設定**
- `blockdev --setra` コマンドで `ディスクの先読みバッファサイズ` を変更可能。
- **シーケンシャル I/O が多い場合** → **先読みバッファを増やす**
- **ランダム I/O が多い場合** → **先読みを減らす**

```sh
blockdev --setra 4096 /dev/sda
```

**太郎**：「大きなファイルの `動画編集` や `バックアップ処理` なら、 `先読みを増やす` のが効果的なんですね！」

---

#### **2.2 書き込みキャッシュ設定**
**花子**：「ディスクの `ライトキャッシュ（書き込みキャッシュ）` もチューニングポイントよ。」

- **キャッシュを有効化**（`hdparm -W1`）
- **キャッシュを無効化**（`hdparm -W0`）

「データベースの `クラッシュ時の整合性を重視する場合` は `キャッシュを無効化` して、 `fsync を確実に処理させる` ことが重要ね。」

**太郎**：「ってことは、 `データの整合性が重要な環境` では `書き込みキャッシュをオフ` にして、 `パフォーマンス優先ならオン` にするってことですね！」

---

### **3. ディスクコントローラのパラメータ**
**花子**：「ディスクコントローラ（RAID コントローラなど）の設定も、 `I/O の最適化` に影響を与えるの。」

#### **3.1 RAID レベルの選択**
- **RAID 0（ストライピング）** → **高速だけど冗長性なし**
- **RAID 1（ミラーリング）** → **冗長性あり、読み取り速度向上**
- **RAID 5/6（パリティ付き）** → **バランス型、書き込み速度がやや低下**
- **RAID 10（ミラー＋ストライプ）** → **高性能かつ冗長性あり**

「例えば、 `データベースサーバー` なら `RAID 10`、 `大容量ストレージ` なら `RAID 5` が適しているわ。」

---

**花子**：「チューニングを `自動車の運転設定` に例えると、こんな感じね。」

1. **OS のパラメータ（ionice, I/O スケジューラ）** → **アクセルやブレーキの感度**
2. **ディスクデバイスのパラメータ（read-ahead, キャッシュ）** → **燃費モードやスポーツモード**
3. **ディスクコントローラのパラメータ（RAID, キャッシュ）** → **駆動方式（2WD, 4WD）**

**太郎**：「なるほど！ `ワークロードに応じた設定変更` で、 `最適なドライブ` ができるんですね！」

---

### **まとめ**
**花子**：「ディスク I/O の `パフォーマンスを向上` させるには、 `OS・ディスク・コントローラ` の 3 つのレベルで `適切なパラメータ調整` をするのが重要よ。」

**太郎**：「ありがとうございます！ `ionice` や `read-ahead` の設定を調整して、 `実際にどれくらい I/O パフォーマンスが変わるか試してみます！」 

# 参考リンク

システムパフォーマンス関連記事の目次

- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)

システムパフォーマンス関連記事は、以下の書籍を参考に記述しています。

- [［改訂新版］プロのためのLinuxシステム構築・運用技術](https://www.amazon.co.jp/dp/B01LZURAPK)
- [改訂2版 ネットワークエンジニアの教科書](https://www.amazon.co.jp/dp/B07NXQ4TDV)
- [絵で見てわかるシステムパフォーマンスの仕組み](https://www.amazon.co.jp/dp/B00LHFOTF4)
- [詳解 システム・パフォーマンス 第2版](https://www.oreilly.co.jp/books/9784814400072/)
- [入門 モダンLinux](https://www.oreilly.co.jp/books/9784814400218/)
- [Linuxシステム管理](https://www.oreilly.co.jp/books/9784873113463/)