【初心者向け】ディスク I/O の基本概念（コンセプト）【5分で読める】

# ディスク I/O の概念

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

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

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

**場面：オフィスの休憩室**
*太郎がコーヒーを片手に花子のデスクへ向かう*

**太郎**：「花子先輩、ディスク I/O のパフォーマンスについて勉強してるんですが、いまいち理解できなくて…。ディスク I/O について教えてもらえませんか？」

**花子**：「いい質問ね。ディスク I/O のパフォーマンスを評価するときは、いくつかの重要な概念を押さえておく必要があるのよ。」

---

#### **ディスク I/Oの時間について**
**花子**：「まずは、I/O にかかる時間について考えましょう。I/O の時間は、主に次の３つに分けられるの。」

1. **I/O待ち時間（I/O Wait Time）**  
   - 「ディスクが他のリクエストを処理している間、キューで待機している時間。」

2. **I/Oサービス時間（I/O Service Time）**  
   - 「実際にディスクがデータを読み書きしている時間。」

3. **I/O要求時間（I/O Request Time）**  
   - 「I/O のリクエストを出してから完了するまでの時間。つまり `待ち時間 + サービス時間` の合計。」

**太郎**：「なるほど。I/O って単純にデータの読み書きだけじゃなくて、待ち時間も影響するんですね。」

---

#### **タイムスケールの違い**
**花子**：「次に `タイムスケール` の話ね。ディスク I/O のパフォーマンスは `ミリ秒` や `マイクロ秒` の単位で考えるの。例えば…」

- **HDD（ハードディスク）** はミリ秒（ms）単位
- **SSD（ソリッドステートドライブ）** はマイクロ秒（µs）単位

「だから、SSD は HDD に比べて I/O の速度が格段に速いのよ。」

**太郎**：「そういえば、データベースのサーバーでは SSD を使うことが多いですよね。」

---

#### **キャッシング（Caching）**
**花子**：「次は `キャッシング` の話ね。キャッシュを活用することで、ディスク I/O のレイテンシ（遅延）を減らせるの。」

- **キャッシュヒット**：「すでにキャッシュにデータがある場合、ディスクを読みに行かずに高速に処理できる。」
- **キャッシュミス**：「キャッシュにデータがない場合、ディスクアクセスが発生するので遅くなる。」

「例えば、OS には `ページキャッシュ` という仕組みがあって、最近使ったデータを RAM に保存しておくの。これで頻繁にアクセスされるデータの I/O を減らせるのよ。」

**太郎**：「じゃあ、RAM のサイズが大きいほうが、キャッシュヒットしやすくなってパフォーマンスが上がるってことですね！」

---

#### **ランダム I/O と シーケンシャル I/O**
**花子**：「ディスクのアクセスには `ランダム I/O` と `シーケンシャル I/O` という２種類があるの。」

1. **シーケンシャル I/O（Sequential I/O）**  
   - 「データが連続して配置されていて、一度に大量のデータを読み書きするパターン。HDD でも SSD でも高速。」

2. **ランダム I/O（Random I/O）**  
   - 「データがディスク上のバラバラな場所にあって、ランダムにアクセスするパターン。特に HDD では遅くなる。」

「HDD の場合、ディスクの `回転` と `磁気ヘッドの移動` に時間がかかるから、ランダムアクセスが遅くなるのよ。逆に SSD はヘッドの移動がないから、ランダムアクセスも高速。」

**太郎**：「データベースのインデックス検索みたいな処理は、ランダム I/O が多そうですね。」

**花子**：「その通り！だから、データベースを高速化するには `インデックスをメモリに載せる` とか `SSD を使う` といった対策が有効なの。」

---

#### **I/O サイズと IOPS（Input/Output Operations Per Second）**
**花子**：「I/O のパフォーマンスを測る指標に `IOPS` というのがあるの。」

- **IOPS（アイオーピーエス）**：「1秒間に処理できる I/O の回数」
- **I/O サイズ**：「1回の I/O で扱うデータ量」

「HDD は IOPS が低いけど、1回の I/O で `大きなデータサイズ` を扱えば効率的に使えるの。一方、SSD は `小さいデータ` を大量に扱うランダム I/O に強い。」

**太郎**：「ってことは、大きいファイルを連続で書き込む処理なら HDD でも問題ないってことですね。」

---

**花子**：「ここまでの話を現実世界で考えてみると、こういうイメージね。」

- **I/O待ち時間 → レジの行列待ち**  
  「スーパーで買い物するとき、レジが混んでたら並ぶよね？これが I/O待ち時間。」

- **I/Oサービス時間 → レジでの会計時間**  
  「自分の番がきたら会計する。この時間が I/Oサービス時間。」

- **キャッシュヒット → ポケットの小銭**  
  「会計時に `ちょうどの金額` をポケットから出せればすぐ終わる（キャッシュヒット）。でも、財布から探すと時間がかかる（キャッシュミス）。」

- **シーケンシャル I/O → ベルトコンベア方式のレジ**  
  「流れ作業で商品を順番に処理すれば速い。これがシーケンシャル I/O。」

- **ランダム I/O → 商品を探し回る買い物**  
  「店内で欲しいものをあちこち探してると時間がかかる。これがランダム I/O。」

---

### **まとめ**
**花子**：「ディスク I/O のパフォーマンスを理解するには、待ち時間やキャッシュ、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/)