システムデザイン完全ガイド ①|導入と土台 — 数字・スケール・見積もり・性能

システムデザイン

SYSTEM DESIGN GUIDE — PART 1 / 7

  1. 導入と土台数字・スケール・見積もり・性能
  2. READ MEこのガイドの使い方
    1. 誰のためのガイドか
    2. 読み方(推奨は 3 周)
    3. 本文中の記号
    4. 数値・仕様・法令の扱い
  3. MAPシリーズ全体の地図
  4. CHAPTER 00システムデザインとは何か
    1. 0.1一言で言うと
    2. 0.2何と何がぶつかるのか(トレードオフの一覧)
    3. 0.3面接官が見ている 5 つのシグナル
    4. 0.4良い設計に共通する性質
    5. 0.5学び方の心構え
  5. CHAPTER 01コンピュータの中では何が起きているのか
    1. 1.1なぜ「数字」から始めるのか
    2. 1.2覚えるべきレイテンシの数字
    3. 1.3メモリ階層とキャッシュライン
    4. 1.4シーケンシャル読み取り vs ランダム読み取り
    5. 1.51 台のマシンでどこまでできるのか
  6. CHAPTER 02「スケールする」とはどういうことか
    1. 2.1スケールアップとスケールアウト
    2. 2.2ステートレスであることの意味
    3. 2.3スケーリングの標準的な進化の順番
    4. 2.4ボトルネックはどこか(4 つの資源)
    5. 2.5アムダールの法則とユニバーサルスケーラビリティ
  7. CHAPTER 03概算見積もりの技術
    1. 3.1覚えるべき数字(これだけ)
    2. 3.2見積もりの手順(5 ステップ)
      1. ステップ 1:ユーザー数から DAU を出す
      2. ステップ 2:1 人あたりの行動回数を仮定する
      3. ステップ 3:QPS を出す(平均とピーク)
      4. ステップ 4:ストレージを出す(1 日 → 1 年 → 5 年、レプリカ込み)
      5. ステップ 5:帯域とマシン台数
    3. 3.3実例:Twitter 風サービスの見積もり
    4. 3.4見積もりの作法
  8. CHAPTER 04性能を語るための言葉
    1. 4.1レイテンシとスループット
    2. 4.2平均を信じてはいけない — パーセンタイル
    3. 4.3リトルの法則
      1. 使い方 1:スレッド数の決定
      2. 使い方 2:限界の把握
    4. 4.4使用率とレイテンシの非線形な関係
    5. 4.5性能に関する用語の整理

導入と土台数字・スケール・見積もり・性能

システムデザインは暗記科目ではありません。限られた資源のなかで、相反する要求のどれを優先するかを決め、その理由を説明する仕事です。第1回は、その仕事の正体と、議論の土台になる「数字」を扱います。

収録:第 0 章 〜 第 4 章 / 前提知識:100 行くらいのコードが書けること

READ MEこのガイドの使い方

誰のためのガイドか

  • プログラミングは書けるが「大規模システム」と言われるとピンとこない人
  • Web アプリを作ったことはあるが、ユーザーが 1 億人になったら何が壊れるのか説明できない人
  • Google / Amazon / Meta などのシステムデザイン面接を突破したい人
  • 業務で「この設計で大丈夫ですか?」と聞かれて、自信を持って答えたい人

前提知識は「何かしらのプログラミング言語で 100 行くらいのコードが書ける」だけです。ネットワークもデータベースも分散システムも、このシリーズの中で 1 から説明します。

初心者がこれを読み、手を動かす演習と模擬面接を重ねることで、Google などのシステムデザイン面接で要件・規模・トレードオフを説明できる土台を作る。

そのために、次の 3 つを同時に満たすように書いています。

  1. 易しい — 専門用語は必ず初出時に日常の言葉で言い換える
  2. 本格的 — 現場と論文で実際に使われている知識だけを載せる。「面接用の暗記」で終わらせない
  3. 使える — 面接でそのまま口に出せる言い回し、判断基準、数字を載せる

読み方(推奨は 3 周)

やること 目安時間
1 周目 とにかく通読。分からない所は飛ばす。「そういう部品があるんだ」を掴む 15〜20 時間
2 周目 各章末の「一問一答」に答えられるか確認しながら読む。手を動かす 30〜40 時間
3 周目 第 7 部の演習問題を、紙とペンだけで 45 分で解き、録音・採点・解き直しを行う 30 時間+
⚠️ 落とし穴

1 周目で完璧に理解しようとしないでください。システムデザインは「部品の名前を知る」→「部品の中身を知る」→「部品を組み合わせる」の順にしか身につきません。最初は名前だけで十分です。

本文中の記号

本文には 6 種類のマーカーが出てきます。このシリーズでは、それぞれ色分けされた枠で表示されます。

記号 意味
🎯 GOAL この章のゴール
💡 たとえ話 直感的なたとえ話
⚠️ 落とし穴 よくある誤解・落とし穴
🎤 面接 面接での使いどころ・言い回し
📐 数字・公式 覚えておくべき数字・公式
🔬 深掘り 一段深い話(初回は飛ばして OK)

数値・仕様・法令の扱い

本文の数値は、暗記すべき物理的な上限、計算例、経験則、ベンチマーク例が混在します。「前提」「単位」「測定条件」を必ず併記し、製品の既定値・料金・法令・採用プロセスは更新されるものとして、利用時点の公式ドキュメント、料金表、法務・リクルーターの案内で再確認してください。一つの製品名や数字を、別の製品・規模・障害モデルへそのまま一般化しないでください。

また、このガイドを読み切ることだけで採用結果を保証することはできません。Google の Software Engineer 選考では、職種・レベル・地域・時期に応じて、コーディング、行動面接、職務に固有の知識、実務経験なども評価されます。最新の選考内容は公式案内とリクルーターの説明を確認してください。

MAPシリーズ全体の地図

全 7 部・51 章の構成です。各部がこのシリーズの 1 記事に対応します。

PART 1 — 準備運動 + すべての土台(この記事)

  • 0システムデザインとは何か
  • 1コンピュータの中では何が起きているのか
  • 2「スケールする」とはどういうことか
  • 3概算見積もりの技術
  • 4性能を語るための言葉(レイテンシ・スループット・待ち行列)

PART 2 — ネットワークと通信

  • 5インターネットの基礎(IP / TCP / UDP / QUIC)
  • 6HTTP と TLS
  • 7DNS
  • 8ロードバランサとプロキシ
  • 9API 設計
  • 10リアルタイム通信(WebSocket / SSE / プッシュ)

PART 3 — データを保存する

  • 11ストレージエンジンの中身(B-Tree と LSM-Tree)
  • 12リレーショナルデータベースとインデックス
  • 13トランザクションと分離レベル
  • 14NoSQL の地図
  • 15レプリケーション
  • 16シャーディング(パーティショニング)
  • 17CAP 定理と一貫性モデル
  • 18分散トランザクションと冪等性
  • 19分散合意(Paxos / Raft)とリース

PART 4 — システムの部品箱

  • 20キャッシュと CDN
  • 21メッセージキューとストリーム処理基盤
  • 22全文検索とベクター検索(セマンティック検索・ANN)
  • 23オブジェクトストレージとファイル配信
  • 24レート制限
  • 25分散 ID 生成
  • 26確率的データ構造
  • 27地理空間インデックス

PART 5 — 壊れないシステムを作る

  • 28可用性・SLI / SLO・エラーバジェット
  • 29冗長化とフェイルオーバー
  • 30タイムアウト・リトライ・サーキットブレーカ
  • 31カスケード障害とメタスタブル障害
  • 32オブザーバビリティ(監視・ログ・トレース)
  • 33安全なデプロイとスキーマ変更
  • 34キャパシティプランニングとオートスケーリング
  • 35インシデント対応とポストモーテム

PART 6 — アーキテクチャの型

  • 36モノリスとマイクロサービス
  • 37イベント駆動・CQRS・イベントソーシング
  • 38バッチ処理とストリーム処理
  • 39マルチリージョンと災害対策
  • 40セキュリティ
  • 41プライバシーとコンプライアンス
  • 42コストの設計
  • 43AI・機械学習・LLM・AI エージェントのシステム設計

PART 7 — 面接を突破する

  • 44Google の面接プロセス全体像
  • 45システムデザイン面接の進め方(45 分の台本)
  • 46評価シグナルと減点ポイント
  • 47演習:設計問題 19 本ノック
  • 48Google の実システムを読む(GFS / Bigtable / Spanner / Borg …)
  • 49コーディング面接・OS・並行処理の最低限
  • 5012 週間の学習ロードマップ
  • 51用語集

CHAPTER 00システムデザインとは何か

🎯 GOAL

システムデザインという仕事の正体と、面接で何が測られているかを理解する。

0.1一言で言うと

システムデザインとは、「限られた資源の中で、相反する要求のどれを優先するかを決め、その理由を説明できるようにする仕事」である。

プログラミングには「正解のコード」がある程度存在します。テストが通れば正解です。しかしシステムデザインに唯一の正解はありません。あるのは「その状況では妥当な選択」と「その状況では明らかにまずい選択」の 2 つだけです。

💡 たとえ話

引っ越し先の家を選ぶのに似ています。「駅から近い」「広い」「安い」は同時には満たせません。独身で終電が遅いなら駅近を、子どもが 3 人いるなら広さを選ぶ。「あなたはどれを選び、なぜそれを選んだのか」を説明できることが設計です。「駅近で広くて安い家がいいです」と言うだけの人は、設計をしていません。

0.2何と何がぶつかるのか(トレードオフの一覧)

システムデザインで登場する対立軸は、実はそれほど多くありません。以下がほぼ全部です。この表はシリーズを通じて何度も戻ってくることになります。

対立軸 一方を取ると もう一方を取ると
一貫性 vs 可用性 常に正しいデータ(銀行残高) 常に応答する(SNS のいいね数)
レイテンシ vs スループット 1 件を速く(対話的な検索) 全体で大量に(夜間バッチ)
正確さ vs コスト 全件を厳密に集計 近似値で 1/100 のコスト
読み最適化 vs 書き最適化 インデックスを増やす インデックスを減らす
強い結合 vs 疎結合 開発が速い・性能が良い 独立して変更・障害が伝播しない
今すぐ vs 後で 同期処理(結果がすぐ返る) 非同期処理(キューに積む)
シンプル vs 高機能 運用が楽・障害が少ない 要求を全部満たせる
⚠️ 落とし穴

「良い設計=最新技術を全部使った設計」ではありません。むしろ逆です。要件を満たす最もシンプルな構成が最良の設計です。面接で「Kafka と Redis と Elasticsearch と Kubernetes を使います」と最初に言う人は、ほぼ確実に低い評価になります。なぜそれが必要かを、要件から導けているかが見られています。

0.3面接官が見ている 5 つのシグナル

Google のシステムデザイン面接は「知識テスト」ではなく「一緒に働けるかのシミュレーション」です。評価者は次の 5 点を見ています。

  1. 曖昧さを扱えるか(Dealing with ambiguity)
    問題は必ず曖昧に出されます。「Twitter を設計して」だけです。まず質問して要件を絞れる人が高評価。いきなり描き始める人は低評価。
  2. 数字で語れるか(Quantitative reasoning)
    「たくさんのリクエスト」ではなく「1 日 5 億リクエスト、ピーク 2 万 QPS、だから 1 台では無理で 50 台必要」と言えるか。
  3. トレードオフを言語化できるか(Trade-off articulation)
    「A を選びます」だけでは足りません。「A を選びます。理由は X。ただし Y という欠点があり、それは Z で緩和します。もし要件が W に変われば B を選びます」— このように前提とトレードオフを説明すると評価されやすくなります。
  4. 深く掘れるか(Technical depth)
    面接官は必ず 1〜2 箇所を深掘りします。「そのキャッシュが落ちたら?」「そのインデックスはどう保存されている?」表面的な暗記だと即座に崩れます。
  5. 協調できるか(Collaboration)
    面接官のヒントを無視する、指摘に反発する、逆に何でも「はいそうします」と迎合する。どれも減点です。根拠を持って議論し、良い指摘は取り入れるのが正解です。
🎤 面接

最初の一言(テンプレート)

OPENING SCRIPT
「ありがとうございます。まず要件を確認させてください。
 機能要件として押さえたいのは A・B・C だと思っていますが、
 今回スコープに入れるべきものはどれでしょうか。
 また規模感として、想定ユーザー数と読み書きの比率を伺えますか。」

これを言えるだけで、上位 30% には入ります。

0.4良い設計に共通する性質

面接でも実務でも、良い設計には次の性質があります。設計に詰まったらこのリストに戻ってください。

  • 単純である:部品が少なく、データの流れが一方向で、説明が短い
  • 境界が明確:「このサービスは何に責任を持つか」が一文で言える
  • 失敗を前提にしている:どの部品が落ちても、システム全体は degraded(機能低下)で済む
  • 測定できる:何が起きているか外から観測できる
  • 段階的に成長できる:10 倍の負荷に、作り直しではなく台数増加で対応できる
  • 元に戻せる:変更をロールバックできる。データを壊す変更を一発でやらない

0.5学び方の心構え

システムデザインの学習でつまずく最大の原因は、部品の「中身」を知らないまま名前だけ覚えることです。たとえば「キャッシュには Redis を使います」と言えても、次に答えられなければ面接では 1 分で崩されます。

  • Redis はなぜ速いのか(メモリ上の単一スレッドのイベントループ)
  • 落ちたらどうなるのか(キャッシュスタンピードで DB が死ぬ)
  • データが消えても良いのか(永続化は RDB / AOF の 2 方式、どちらも完全ではない)

本シリーズは常に「名前 → 中身 → 使いどころ → 落とし穴」の順で説明します。急がば回れです。第 1 部の基礎は退屈に見えますが、ここが全ての土台になります。

第 0 章 一問一答

システムデザインの「正解」とは何か。
唯一の正解は存在しない。要件と制約に対して、選択の理由とトレードオフを説明できる設計が正解。
面接で最初にすべきことは。
要件の明確化(機能要件・非機能要件・規模)。設計を描き始めるのはその後。
「良い設計」の第一条件は。
要件を満たす範囲で最もシンプルであること。

CHAPTER 01コンピュータの中では何が起きているのか

🎯 GOAL

「速い・遅い」を感覚ではなく数字で言えるようになる。

1.1なぜ「数字」から始めるのか

システムデザインの議論は、突き詰めると次の 3 つに帰着します。

  1. データはどこにあるか(CPU キャッシュ / メモリ / SSD / 別のマシン / 別の大陸)
  2. そこへ行くのに何秒かかるか
  3. 1 秒あたり何回行けるか

つまり「距離」と「回数」の話です。この距離感を体に入れることが最初の一歩です。

1.2覚えるべきレイテンシの数字

📐 数字・公式

これは丸暗記の価値がある表です(Jeff Dean の “Numbers Everyone Should Know” を現代化したもの)。右列は 1ns = 1 秒 に引き伸ばした人間スケールです。

操作 だいたいの時間 人間スケール換算
L1 キャッシュ参照 1 ns 1 秒
分岐予測ミス 3 ns 3 秒
L2 キャッシュ参照 4 ns 4 秒
ミューテックスのロック/解放 20 ns 20 秒
メインメモリ参照 100 ns 1 分 40 秒
1 KB を Snappy で圧縮 2 µs 33 分
1 KB を 10 Gbps ネットワークで送る 1 µs 17 分
SSD (NVMe) のランダム読み取り 20〜100 µs 6〜28 時間
メモリから 1 MB を順次読む 20〜50 µs 6〜14 時間
同一データセンタ内のラウンドトリップ 0.5 ms 5.8 日
SSD から 1 MB を順次読む 200〜300 µs 2.5 日
HDD のシーク 5〜10 ms 2〜4 ヶ月
HDD から 1 MB を順次読む 5〜20 ms 2〜8 ヶ月
東京 ↔ 米国西海岸のラウンドトリップ 100〜120 ms 3〜4 年
東京 ↔ ヨーロッパのラウンドトリップ 220〜260 ms 7〜8 年
💡 たとえ話

この表から得るべき直感は 4 つです。

  • メモリはディスクの約 1000 倍速い(100 ns vs 100 µs)
  • 同じデータセンタ内の通信(0.5 ms)は、SSD 読み取り(0.1 ms)より遅い → 「ネットワーク越しのキャッシュ」より「ローカルのメモリ」の方が圧倒的に速い
  • 大陸を跨ぐ通信は 100 ms オーダー。これは光の速度で決まっており、お金では解決できない。ユーザーの近くにデータを置く(CDN・マルチリージョン)以外に手はない
  • HDD のシークは地獄。だからログ構造(追記のみ)の設計が生まれた
⚠️ 落とし穴

光速の壁。光ファイバー中の光速は約 20 万 km/s。東京〜サンフランシスコは約 8,300 km なので片道 41 ms、往復 83 ms。実際は経路が直線でないので 100〜120 ms。この経路を、同じ距離・同じプロトコルのまま 10 ms にすることはできません。レイテンシを下げるには、データと計算をユーザーの近くへ置く、通信回数を減らす、キャッシュするなど、要件に応じた複数の手段を使います。

1.3メモリ階層とキャッシュライン

CPU から見たデータの「近さ」は階層になっています。

MEMORY HIERARCHY
        速い・小さい・高い
            ▲
   ┌──────────────────────────┐
   │ レジスタ        数百 B   │  < 1 ns
   ├──────────────────────────┤
   │ L1 キャッシュ   32-64 KB │  ~1 ns
   ├──────────────────────────┤
   │ L2 キャッシュ  256KB-1MB │  ~4 ns
   ├──────────────────────────┤
   │ L3 キャッシュ    8-64 MB │  ~15 ns  ← コア間で共有
   ├──────────────────────────┤
   │ メインメモリ   16GB-2TB  │  ~100 ns
   ├──────────────────────────┤
   │ NVMe SSD         TB 級   │  ~50 µs
   ├──────────────────────────┤
   │ HDD / オブジェクトストレージ │ ~10 ms
   └──────────────────────────┘
            ▼
        遅い・大きい・安い

CPU のロード命令は 1 バイトを扱えます。ただし、キャッシュやメモリ階層では通常キャッシュライン(例:64 バイト)単位でデータが移動します。配列が連結リストより速くなりやすい理由は、連続配置と予測可能なアクセスによる局所性です。

LOCALITY
配列 [a][b][c][d][e]...    ← 1 回のキャッシュラインで 8〜16 要素まとめて来る
連結リスト a → (どこか) b → (どこか) c   ← 1 要素ごとにキャッシュミス(100 ns)
🔬 深掘り

実務での意味。同じ O(n) でも、配列走査と連結リスト走査では10 倍以上速度が違います。「計算量が同じなら同じ速さ」ではありません。データベースがデータをページ(4KB〜16KB)単位で扱うのも同じ理由です。

1.4シーケンシャル読み取り vs ランダム読み取り

ストレージ シーケンシャル ランダム(4KB)
HDD 200 MB/s 約 0.5 MB/s (120 IOPS) 400 倍
SATA SSD 550 MB/s 約 300 MB/s (80K IOPS) 2 倍
NVMe SSD 3〜7 GB/s 約 2 GB/s (500K IOPS) 2〜3 倍
📐 数字・公式

重要な帰結

  • HDD 時代は「ランダムアクセスを絶対に避ける」設計(=ログ構造、LSM-Tree)が支配的だった
  • SSD 時代でもランダムは不利だが差は縮まった。ただし書き込みは SSD 特有の問題(消去はブロック単位・ウェアレベリング・ライトアンプリフィケーション)があり、「順次書き込みが有利」は今も真

1.51 台のマシンでどこまでできるのか

⚠️ 落とし穴

最も多い誤解:「大規模=すぐ分散」ではありません。2020 年代のサーバー 1 台のスペックを直視してください。

資源 現代的な 1 台
CPU 64〜192 コア
メモリ 256 GB 〜 2 TB
NVMe SSD 10〜100 TB、数百万 IOPS
ネットワーク 25〜100 Gbps

1 台でできることの目安

  • 数万 QPSHTTP リクエスト処理(軽い処理なら 10 万 QPS 以上)
  • 数万 TPSPostgreSQL の読み取り(適切なインデックスがあれば)
  • 10 万 ops/sRedis 単一インスタンス(パイプラインで 100 万も可)
  • ≒ 100 GB全世界のツイート 1 日分のテキスト(5 億件 × 200B)=メモリに載る
🎤 面接

強い一言

SCRIPT
「まず単一のリレーショナルデータベースで足りるかを見積もります。
 見積もりでは 1 日 2,000 万件、ピーク 500 QPS なので、
 リードレプリカ 2 台を足した構成で十分に収まります。
 分散データベースを入れるのは、データ量が単一ノードの容量を超えるか、
 書き込みが 1 台の限界に達してからで良いと考えます。」

これは「早すぎる最適化を避けられる」シグナルになり、高評価です。

第 1 章 一問一答

メモリ参照と SSD ランダム読み取りは何倍違うか。
およそ 500〜1000 倍(100 ns vs 50 µs)。
同一 DC 内 RTT はいくつか。
約 0.5 ms。SSD 読み取りより遅い。
大陸間 RTT を下げる方法は。
ない。データをユーザーの近くへ置く(CDN / マルチリージョン)。
なぜ DB はページ単位で I/O するのか。
ストレージとキャッシュの転送単位に合わせ、シーケンシャル性を活かすため。

CHAPTER 02「スケールする」とはどういうことか

🎯 GOAL

負荷が増えたときにシステムを大きくする手段を、順番に説明できるようになる。

2.1スケールアップとスケールアウト

スケールアップ(垂直) スケールアウト(水平)
やること 1 台をより強いマシンに 台数を増やす
利点 実装が変わらない・単純 理論上は無限に伸びる・耐障害性
欠点 上限がある・高価(性能あたりの価格が非線形)・単一障害点 分散の複雑さが全部乗ってくる
向くもの データベース(特にライター)、レイテンシ厳しい処理 Web サーバー、ワーカー
📐 数字・公式

鉄則:まずスケールアップ、どうしても足りなくなったらスケールアウト。ただし最初から水平に増やせる形(ステートレス)で作っておく

2.2ステートレスであることの意味

STATEFUL — 壊れ方
ユーザー A → [サーバー1] メモリにログイン状態
             次のリクエストが [サーバー2] に行くと → ログアウト扱いになる!
STATELESS — あるべき形
ユーザー A → [サーバー1/2/3 どれでもOK] → 状態は外部(Redis/DB/トークン)に
💡 たとえ話

ステートフルなサーバーは「担当者が変わると話が通じない窓口」、ステートレスは「カルテが共有されていてどの医師でも診られる病院」です。

ステートレス化の具体策

  • セッションを Redis や DB に外出しする
  • あるいはセッション自体をなくし、署名付きトークン(JWT)をクライアントに持たせる
  • ファイルアップロードをローカルディスクではなくオブジェクトストレージ(S3 等)へ
⚠️ 落とし穴

スティッキーセッション(同じユーザーを同じサーバーへ固定)は一見便利ですが、

  • サーバーを落とすとそのユーザーだけ影響を受ける
  • 負荷が偏る
  • デプロイのたびに全員のセッションが切れる

ので、避けられるなら避けるのが定石です。

2.3スケーリングの標準的な進化の順番

これは面接で「規模が 10 倍になったら?」と聞かれたときの回答の骨格になります。

SCALING LADDER — 0 → 8
【第0段階】1台に全部(Web + DB + ファイル)
       │  ユーザー数千人まで
       ▼
【第1段階】Web と DB を分離
       │  DB の I/O が Web の CPU を邪魔しなくなる
       ▼
【第2段階】Web を複数台 + ロードバランサ
       │  ステートレス化が前提。ここで可用性も上がる
       ▼
【第3段階】キャッシュ導入(Redis / Memcached)
       │  読み取りの 80〜95% を DB から剥がす
       ▼
【第4段階】CDN 導入(静的ファイル・画像・動画)
       │  帯域とレイテンシが劇的に改善
       ▼
【第5段階】DB のリードレプリカ(読み取りスケール)
       │  ここまでで大半のサービスは足りる
       ▼
【第6段階】非同期化(メッセージキュー + ワーカー)
       │  重い処理(メール送信・画像変換・集計)をリクエストから外す
       ▼
【第7段階】DB のシャーディング(書き込みスケール)
       │  ここから複雑さが跳ね上がる。本当に必要か毎回問う
       ▼
【第8段階】サービス分割(マイクロサービス)/マルチリージョン
          組織の規模が理由になることが多い
🎤 面接

使い方:いきなり第 8 段階の絵を描かないこと。「まず第 2〜5 段階の構成を提示 → 面接官が『書き込みが 10 万 QPS になったら?』と聞く → 第 6〜7 段階へ進む」という対話の階段を作るのが理想です。

2.4ボトルネックはどこか(4 つの資源)

システムの限界は必ず次の 4 つのどれかに現れます。どれが先に枯渇するかを常に考えます。

資源 枯渇の兆候 典型的な対処
CPU 使用率 80%+、レイテンシ悪化 台数増、アルゴリズム改善、キャッシュ、圧縮をやめる
メモリ OOM、スワップ、GC 頻発 データ構造の見直し、外部キャッシュ、ページング
ディスク I/O iowait 高、キュー深さ増 インデックス、キャッシュ、SSD、シャーディング
ネットワーク 帯域飽和、パケットロス 圧縮、CDN、ペイロード削減、リージョン配置

さらに、見落とされがちな「論理的な」資源があります。

  • コネクション数(DB の max_connections、ファイルディスクリプタ)
  • ロック(同じ行への更新競合)
  • スレッド/ワーカープール
  • サードパーティ API のレート制限
⚠️ 落とし穴

実務で最も多い障害原因は CPU 不足ではなく、接続数の枯渇とロック競合です。

2.5アムダールの法則とユニバーサルスケーラビリティ

📐 数字・公式

アムダールの法則:処理のうち並列化できない割合を s とすると、N 並列にしたときの高速化率は

AMDAHL
Speedup(N) = 1 / (s + (1-s)/N)

s = 5%(95% が並列化可能)でも、N → ∞ で高速化は最大 20 倍にしかなりません。

📐 数字・公式

ユニバーサルスケーラビリティ法則(USL):現実はもっと厳しく、ノード間の調整コスト(coherency)が入るため、台数を増やすとある点を境に性能が下がり始めます

USL CURVE
    スループット
      ▲
      │        /‾‾\
      │      /      \__   ← 台数を増やすほど遅くなる領域
      │    /
      │  /
      └──────────────────► ノード数
💡 たとえ話

会議の参加者を 2 人から 10 人にすると意思決定は速くなりません。調整(誰が何を言うか)のコストが増えるからです。分散システムも同じです。

🎤 面接

SCRIPT
「ノードを増やせば線形にスケールするとは限りません。共有リソース(この場合は
 同一シャードへの書き込み)が調整点になるので、シャードキーを見直して
 調整が起きないように分割するのが本質的な解決だと考えます。」

第 2 章 一問一答

水平スケールの前提条件は。
アプリケーションがステートレスであること。
スティッキーセッションの問題点は。
負荷の偏り、サーバー障害・デプロイ時の影響集中。
最初にやるべきスケール策は。
キャッシュと CDN。安価で効果が大きく、複雑さが増えない。
台数を増やしても速くならない理由を 2 つ。
直列部分の存在(アムダール)と、ノード間調整コスト(USL)。

CHAPTER 03概算見積もりの技術

🎯 GOAL

45 分の面接中に 3 分で「必要な台数・容量・帯域」を出せるようになる。

これは面接で最も差がつくスキルです。そして練習すれば必ずできるようになります。

3.1覚えるべき数字(これだけ)

📐 時間

TIME
1 日  = 86,400 秒 ≒ 10^5 秒   ← これだけ覚える
1 ヶ月 ≒ 2.6 × 10^6 秒
1 年  ≒ 3.15 × 10^7 秒 ≒ π × 10^7 秒(覚え方:「パイ かける 1000万秒」)
📐 データサイズ

SIZE
char / ASCII 1 文字 = 1 B      日本語 1 文字 (UTF-8) = 3 B
int = 4 B      long / timestamp / ID = 8 B     UUID = 16 B(文字列表現なら 36 B)
1 KB = 10^3 B    1 MB = 10^6 B    1 GB = 10^9 B    1 TB = 10^12 B    1 PB = 10^15 B
📐 典型的なオブジェクト

OBJECT SIZES
ツイート 1 件(メタ込み)        ≒ 300 B 〜 1 KB
チャットメッセージ 1 件          ≒ 200 B
ユーザーレコード                 ≒ 1 KB
Web ページ (HTML)                ≒ 50〜100 KB
写真(圧縮済み、スマホ)         ≒ 1〜5 MB
サムネイル                       ≒ 20 KB
動画 1 分(1080p, H.264)        ≒ 30〜60 MB(≒ 5 Mbps)
動画 1 分(4K)                  ≒ 200 MB(≒ 25 Mbps)
ログ 1 行                        ≒ 200〜500 B
📐 変換の近道

SHORTCUTS — 面接で口に出す
1 日 100 万リクエスト  ≒ 12 QPS
1 日 1 億リクエスト    ≒ 1,160 QPS ≒ 1.2 K QPS
1 日 10 億リクエスト   ≒ 11.6 K QPS
ピーク QPS = 平均 QPS × 2〜5(サービス次第。SNS なら 2〜3、EC のセールなら 10〜100)

3.2見積もりの手順(5 ステップ)

ステップ 1:ユーザー数から DAU を出す

総登録ユーザー 5 億人 → DAU(1日のアクティブ)は 20〜30% が典型 → 1 億人

ステップ 2:1 人あたりの行動回数を仮定する

1 人 1 日あたり 投稿 0.1 回、閲覧 20 回(読み:書き = 200:1)

ステップ 3:QPS を出す(平均とピーク)

書き込み: 1 億 × 0.1 = 1,000 万/日 ÷ 10^5 = 100 QPS(平均)→ ピーク 300 QPS
読み取り: 1 億 × 20  = 20 億/日   ÷ 10^5 = 20,000 QPS(平均)→ ピーク 60,000 QPS

ステップ 4:ストレージを出す(1 日 → 1 年 → 5 年、レプリカ込み)

1 件 1 KB × 1,000 万/日 = 10 GB/日
→ 年 3.6 TB → 5 年 18 TB
→ レプリカ 3 本 = 54 TB
→ インデックス・オーバーヘッドで ×1.3 ≒ 70 TB

ステップ 5:帯域とマシン台数

読み取り帯域 = 20,000 QPS × 1 KB = 20 MB/s(テキストなら軽い)
※ 画像なら 20,000 × 200 KB = 4 GB/s = 32 Gbps → CDN 必須と即断できる

Web サーバー = ピーク 60,000 QPS ÷ 1 台 5,000 QPS = 12 台 → 冗長込みで 20 台
キャッシュ   = ホットデータ(全体の 20%)= 10 GB/日 × 20% × 7日 = 14 GB → 1 台で足りる

3.3実例:Twitter 風サービスの見積もり

🎤 面接

そのまま真似できる話し方(90 秒)

ESTIMATION SCRIPT
「数字を置きます。ざっくりで良いので確認しながら進めます。

 DAU を 2 億人とします。1 人 1 日 2 回投稿、200 回タイムラインを見るとします。

 【書き込み】2 億 × 2 = 4 億ツイート/日。10^5 で割って 4,000 QPS。
       ピークは 3 倍で 12,000 QPS。

 【読み取り】2 億 × 200 = 400 億回/日 = 40 万 QPS。ピーク 120 万 QPS。
       読み:書き = 100:1 なので、読み取り最適化が設計の中心になります。

 【ストレージ】ツイート本文 300 B にメタデータを足して 1 KB とすると、
       4 億 × 1 KB = 400 GB/日、年 146 TB。5 年で 730 TB、レプリカ 3 本で 2.2 PB。
       これは単一 DB では無理なので、シャーディング前提です。

       ただし画像・動画が入ると桁が変わります。仮に 10% のツイートに
       1 MB の画像が付くとすると、4,000 万 × 1 MB = 40 TB/日、年 15 PB。
       これはオブジェクトストレージ + CDN で扱います。

 【メモリ】直近 3 日分のツイートをキャッシュすると 400 GB × 3 = 1.2 TB。
       1 台 128 GB のキャッシュノードなら 10〜20 台のクラスタになります。」

この 90 秒で、面接官は「この人は現場で設計できる」と判断します。

3.4見積もりの作法

✅ やるべきこと ❌ やってはいけないこと
仮定を声に出す:「DAU を 2 億と置きます、良いですか?」 電卓のような精密計算(誰も求めていない)
切りの良い数字に丸める:86,400 → 10^5、1.6 → 2 数字を出しっぱなしで設計に反映しない
桁を間違えない(これが唯一の致命傷)。単位を必ず書く 「たくさん」「大量」で済ませる
出した数字から結論を出す:「したがって単一 DB では足りず、シャーディングが必要です」
⚠️ 最重要

見積もりの目的は正しい数を出すことではなく、アーキテクチャの分岐点を判断することです。「1 台で足りるか」「キャッシュは載るか」「CDN は要るか」「シャードは何個か」の 4 つの判断ができれば合格です。

第 3 章 一問一答

1 日 5 億リクエストは何 QPS か。
5×10^8 / 10^5 = 5,000 QPS。
1 KB × 1 億件/日 は年間何 TB か。
100 GB/日 × 365 ≒ 36.5 TB/年。
読み:書き = 100:1 のシステムの設計方針は。
読み取り最適化(キャッシュ、レプリカ、事前計算=ファンアウト)。
ピーク QPS の見積もり方は。
平均の 2〜5 倍。イベント駆動のサービスなら 10 倍以上も想定する。

CHAPTER 04性能を語るための言葉

🎯 GOAL

レイテンシ・スループット・パーセンタイル・キューの関係を正確に使えるようになる。

4.1レイテンシとスループット

  • レイテンシ (latency):1 件の処理にかかる時間。単位は ms。
  • スループット (throughput):単位時間あたりに処理できる件数。単位は QPS / RPS / TPS。
💡 たとえ話

高速道路で言うと、レイテンシ=東京から大阪までかかる時間、スループット=1 時間に通過できる車の台数。車線を増やす(サーバー台数を増やす)とスループットは上がりますが、1 台あたりの所要時間(レイテンシ)は速くなりません。これは非常に重要な区別です。

⚠️ 落とし穴

「サーバーを増やしたのにレスポンスが速くならない」→ 当然です。混雑(キューイング)が原因だった場合のみ速くなります。

4.2平均を信じてはいけない — パーセンタイル

100 件のリクエストのうち 99 件が 10 ms、1 件が 5,000 ms だったとします。

  • 59.9 ms平均(実態を全く表していない)
  • 10 msp50(中央値)
  • 5,000 msp99 ← 一部のユーザーは 5 秒待たされている
📐 表記

p50 / p90 / p95 / p99 / p99.9 / p99.99(「p99.9」は「99.9 パーセンタイル」)

なぜテール(p99 以上)が重要か

  1. 遅いユーザーほど、たいていデータが多い(=重要な顧客)
  2. 1 ページが 100 個のサービス呼び出しをする場合、各サービスの p99 が 100 ms なら、そのページの 63% が 100 ms 超になる(1 – 0.99^100 = 63%)。これは、各呼び出しが独立で、同時並行に評価され、共通の予算・相関障害・短絡がないという単純化した計算です。実システムでは依存グラフと相関を測定します。これをテイルレイテンシ増幅 (tail latency amplification) と呼びます。
🎤 面接

SCRIPT
「SLO は平均ではなく p99 で定義します。1 リクエストが内部で 20 個のサービスを呼ぶので、
 個々の p99 がそのままページ全体の体感に増幅されるためです。
 対策としてはヘッジドリクエスト(一定時間で返らなければ別レプリカにも投げる)
 を検討します。」
🔬 深掘り

Google の “The Tail at Scale”(Dean & Barroso, 2013)はこのテーマの必読論文です。対策として挙げられているのは次の 4 つ。

  • ヘッジドリクエスト:p95 を過ぎたら 2 台目にも同じ要求を投げ、先に返った方を使う
  • tied requests(同時開始リクエスト):2 台に投げ、片方が処理開始したら他方をキャンセル
  • マイクロパーティション:パーティションを台数より細かく切り、動的に再配置
  • カナリア:危険な要求をまず 1〜2 台で試す

4.3リトルの法則

📐 数字・公式

LITTLE’S LAW
L = λ × W

L : システム内に同時に存在するリクエスト数(並行数)
λ : 到着レート(QPS)
W : 1 件の平均滞在時間(レイテンシ)

使い方 1:スレッド数の決定

1,000 QPS で、1 件の処理に 50 ms かかる
→ L = 1000 × 0.05 = 50
→ 同時に 50 件が処理中 → 最低 50 スレッド(or 50 コネクション)が必要

使い方 2:限界の把握

DB のコネクションプールが 20 本、1 クエリ 10 ms
→ λ = L / W = 20 / 0.01 = 2,000 QPS が上限
これを超えたリクエストはプール待ちで、レイテンシが跳ね上がる
🎤 面接

これを面接で自然に使えると、かなり強いシグナルになります。

4.4使用率とレイテンシの非線形な関係

📐 M/M/1

QUEUEING
W = S / (1 - ρ)      S: 1 件のサービス時間、ρ: 使用率(0〜1)
使用率 ρ 応答時間の倍率
50% 2 倍
70% 3.3 倍
80% 5 倍
90% 10 倍
95% 20 倍
99% 100 倍
💡 たとえ話

これがシステムデザインで最も重要な非線形性です。使用率 90% は「まだ 10% 余裕がある」ではなく、「レイテンシがすでに 10 倍になっている」状態です。

⚠️ 落とし穴

M/M/1 の表は、到着が Poisson、サービス時間が指数分布、単一サーバーなどの仮定に基づきます。CPU 50〜70% や特定の倍率は全システムの規則ではなく、各ワークロードの p99、キュー、GC、I/O を測って余裕を決めます。

UTILIZATION CLIFF
 レイテンシ
   ▲                          /
   │                        /
   │                    /
   │              _/
   │  ____/
   └────────────────────────► 使用率
     0%   50%   70%  85%  95% 100%
                        ↑ ここから先は崖

4.5性能に関する用語の整理

用語 意味
QPS / RPS 1 秒あたりのクエリ/リクエスト数
TPS 1 秒あたりのトランザクション数
IOPS 1 秒あたりのディスク I/O 回数
帯域 (bandwidth) 単位時間に送れるデータ量(bps)。bit であることに注意(1 Gbps = 125 MB/s)
RTT 往復遅延時間
ジッタ レイテンシのばらつき。リアルタイム通話では平均値より重要
コールドスタート キャッシュや JIT が温まっていない状態の遅さ
ヘッドオブラインブロッキング 先頭の遅い処理が後続を全部待たせる現象

第 4 章 一問一答

p99 が重要な理由は。
多数のサービス呼び出しで増幅され、ページ全体の体感を支配するから。
2,000 QPS、レイテンシ 100 ms のとき必要な並行数は。
L = 2000 × 0.1 = 200。
M/M/1 の仮定で使用率 90% が危険な理由は。
待ち行列による平均応答時間がサービス時間の約 10 倍になるから。実際の倍率は負荷、並列度、I/O、GC などで測定する。
1 Gbps は何 MB/s か。
125 MB/s(bit と byte を混同しない)。