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

# ディスク I/O のベンチマーク

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


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

**場面：オフィスのテスト環境**
*太郎が `fio` を使ってディスク I/O のテストをしながら、花子に質問する。*

**太郎**：「花子先輩、ディスク I/O について、 `実際にどのようにテストすればいいのか` 迷っています。」

**花子**：「なるほど。 `実験` を行うことで、 `ディスクのパフォーマンス特性` を数値化できるのよ。 `実験` にはいくつかの手法があるから、それを説明するわね。」

---

### 実験（ベンチマーク）の解説
**花子**：「ディスク I/O の `実験（ベンチマークテスト）` には、次の 7 つの手法があるわ。」

1. **アドホックテスト**
2. **カスタムロードジェネレータ**
3. **マイクロベンチマークツール**
4. **ランダム読み出しの例**
5. **ioping**
6. **fio**
7. **blkreplay**

---

#### **1. アドホックテスト**
**花子**：「`アドホックテスト` は、 `簡単なコマンドを使って` すぐに I/O の基本的な動作を確認する方法よ。」

- `dd if=/dev/zero of=testfile bs=1M count=1000 oflag=direct`
  - **ディスクへの書き込み速度** を計測。
- `dd if=testfile of=/dev/null bs=1M count=1000`
  - **ディスクからの読み出し速度** を計測。

**太郎**：「`dd` はシンプルだから、 `すぐにディスクのスループットを確認` するのに良さそうですね！」

---

#### **2. カスタムロードジェネレータ**
**花子**：「`カスタムロードジェネレータ` を使うと、 `特定のワークロード` を `シミュレーション` できるの。」

- 自作スクリプトで `複数のプロセスが同時に I/O を発生させるシナリオ` を再現。
- `Linux の stress コマンド` で負荷をかける例：
  ```sh
  stress --io 8 --timeout 30s
  ```
  - **8つの並列 I/O を 30秒間発生させる。**

**太郎**：「ってことは、 `実際の運用環境に近い負荷テスト` ができるってことですね！」

---

#### **3. マイクロベンチマークツール**
**花子**：「`マイクロベンチマーク` では、 `ディスクの特定の動作を細かく分析` できるの。」

- 例えば `ランダム I/O のレイテンシ` や `シーケンシャル I/O のスループット` を調べるのに使う。

**太郎**：「たとえば、 `512バイトのランダムリード` みたいに `細かいパラメータでテスト` できるんですね！」

---

#### **4. ランダム読み出しの例**
**花子**：「`ランダム読み出し` のテストをすることで、 `ディスクのランダムアクセス性能` を評価できるわ。」

- 例えば `fio` を使って、`4KB のランダムリード I/O` を `32 並列スレッド` で発生させる：
  ```sh
  fio --name=random-read --rw=randread --bs=4k --numjobs=32 --size=1G --runtime=30s
  ```

**太郎**：「`ランダム I/O に弱い HDD` と、`ランダム I/O に強い SSD` の違いを確認できそうですね！」

---

#### **5. ioping**
**花子**：「`ioping` は `ping コマンドの I/O 版` で、 `ディスクのレイテンシ（遅延）` を測定できるの。」

- 1秒間に1回 I/O を発生させて `レイテンシを測る`：
  ```sh
  ioping -c 10 /dev/sda
  ```

**太郎**：「ネットワークの `ping` みたいに、 `ディスクの応答速度` を測れるんですね！」

---

#### **6. fio**
**花子**：「`fio` は `最も汎用的な I/O ベンチマークツール` で、 `あらゆる I/O パターン` をテストできるわ。」

- 例えば `1MB のシーケンシャル書き込みテスト`：
  ```sh
  fio --name=seq-write --rw=write --bs=1M --numjobs=1 --size=1G --runtime=30s
  ```

- `4KB のランダムリード/ライトテスト（32 並列）`：
  ```sh
  fio --name=random-readwrite --rw=randrw --bs=4k --numjobs=32 --size=1G --runtime=30s
  ```

**太郎**：「`fio` なら、 `様々なパターンの I/O テスト` を実行できるんですね！」

---

#### **7. blkreplay**
**花子**：「`blkreplay` を使えば、 `実際のシステムで発生した I/O パターンを再現` できるの。」

- **本番環境の I/O を記録して、テスト環境で再現できる。**
- **リアルなワークロードをシミュレーションするのに最適！**

**太郎**：「なるほど、 `テスト環境` で `本番のディスク負荷を再現` できるんですね！」

---

**花子**：「ディスクの `実験手法` を `自動車の性能テスト` に例えると、こんな感じね。」

1. **アドホックテスト** → `簡単なスピードテスト`（エンジンの基本性能をチェック）
2. **カスタムロードジェネレータ** → `実際の走行条件を再現したテスト走行`
3. **マイクロベンチマーク** → `ブレーキ性能や加速性能の細かいテスト`
4. **ランダム読み出しの例** → `カーブでの操縦安定性テスト`
5. **ioping** → `レスポンスの早さ（アクセルの応答速度）`
6. **fio** → `多様な運転条件での総合評価`
7. **blkreplay** → `レースのシミュレーションテスト`

**太郎**：「なるほど！ `fio` は `総合的なテスト` で、 `ioping` は `反応速度のテスト` みたいな違いですね！」

---

### **まとめ**
**花子**：「ディスク I/O の `パフォーマンスを評価するには、適切な実験を選ぶことが重要`。 `fio` や `ioping` を活用すれば、 `どこにボトルネックがあるのか` を数値で確認できるわよ。」

**太郎**：「ありがとうございます！ `fio` で `実際の 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/)