- 物理機リージョン/AZ
- ハイパーバイザVM exit で捕まえる
- VMゲストOS今ここ
- コンテナnamespace / cgroup今ここ
- プロセスアプリ / DB
借りた量を動かすとき何が遅れるか。物理機の有限性は増やす側の上限として顔を出します。
まず結論
「自動で増える」は1つの動作ではなく、測定 → 判断 → 起動の3段です。どの段にも遅れがあり、効くのは3つの和だけ後です。
だから短いスパイクには間に合いません。閾値を下げても遅れの構造は変わらず、間に合わせたいなら先に持っておくしかありません。
「CPU が 80% を超えたら増やす」というルールを、5分粒度のメトリクスで設定しました。30秒だけ続くスパイクに間に合うでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
「自動で増える」は3段の手続き
前回、責任の線は契約で決まり技術では消えないと見ました。今回は借りた量を動かす話です。台数が増える仕組みは測定・判断・起動の3段に分かれ、各段が前の段を待ちます。
- 測定 — 負荷を表す値を集め、監視側に届ける
- 判断 — 値を規則に照らし、増やすと決める
- 起動 — 新しい実体を立ち上げ、負荷を受けられるようにする
要点は各段が「待つ」ように作られていることです。測定は一定時間ぶんをまとめて1点を出し、判断は1点では決めず、起動した実体も立ち上がった瞬間から役に立つとは限りません。
だから増やした分が効くのは3つの遅れの和だけ後。これより短い山では、過ぎた後に台数だけが増えます。
実際の文書に書かれている遅れ
各段の遅れが文書にどう書かれているかを見ます(AWS のドキュメント、2026-09-16 時点)。
測定の遅れ。 EC2 のユーザーガイドは既定の basic monitoring をこう書きます。
Status check metrics are available in 1-minute periods. All other metrics are available in 5-minute periods.
(両方式を並べた表の basic monitoring 行)
CPU 使用率は「その他」なので既定は5分に1点。1分粒度にする detailed monitoring は同じ表の次の行に "You are charged per metric that Amazon EC2 sends to CloudWatch." とあり、細かく測るには値段が付きます。
判断の遅れ。 方式ごとに別の仕組みが効きます。cooldown の定義は次のとおり。
After your Auto Scaling group launches or terminates instances, it waits for a cooldown period to end before any further scaling activities initiated by simple scaling policies can start. The intention of the cooldown period is to let your Auto Scaling group stabilize and prevent it from launching or terminating additional instances before the effects of the previous scaling activity are visible.
既定値は "By default, this cooldown period is set to 300 seconds (5 minutes)." ただし同ページ冒頭に次の一文。
起動の遅れ。 instance warmup の定義はこうです。
You can specify how long after an instance reaches the InService state it waits before contributing usage data to the aggregated metrics. This specified time is called the default instance warmup.
既定の扱いに注意が要ります。同じページは "we strongly recommend that you enable and configure the default instance warmup. It is not enabled or configured by default." と書きます。warmup には既定値が無く、既定では有効ですらありません。 目安の "you could start with 300 seconds" は出発点の推奨です。待つ理由も "need time to stabilize" とあり、直後の実体は消費が跳ねるため、その値を混ぜると判断が歪みます。
AWS の EC2 は既定でどの粒度のメトリクスを CloudWatch に送ると文書化されていますか。
遅れた信号で動くものは、すべて振動する
3段の遅れは「反応が遅い」だけの話ではありません。遅れた信号で制御すると、行き過ぎと揺り戻しが起きます。 材料は「少し前の状態」で、効果が見えないまま次を決めれば二重に増やすからです。
だから行き過ぎを抑える仕掛けが入ります。効果が見えるまで次を止める、過去一定期間の最大を採る、など。これは遅れを足すので、安定性と速さは同じ設定の裏表です。
Kubernetes の HorizontalPodAutoscaler がその例です。公式文書(v1.37 時点)は制御ループをこう書きます。
Kubernetes implements horizontal pod autoscaling as a control loop that runs intermittently (it is not a continuous process). The interval is set by the
--horizontal-pod-autoscaler-sync-periodparameter to thekube-controller-manager(and the default interval is 15 seconds).
連続監視ではなく既定15秒ごとの離散ループです。そして既定の挙動。
For scaling down the stabilization window is 300 seconds (or the value of the
--horizontal-pod-autoscaler-downscale-stabilizationcommand line option, if provided). For scaling up there is no stabilization window. When the metrics indicate that the target should be scaled up the target is scaled up immediately.
減らす側は300秒ぶんの記憶で慎重に、増やす側は即時。 理由は書かれていませんが、減らしすぎ(捌けなくなる)を増やしすぎ(費用)より重く見た既定と読めます(解釈)。振動は同文書で "thrashing" "flapping" と呼ばれます。
対比例 — 「外す」判断も、同じ形で遅れている
増やす以外の判断も同じ構造です。第30週『死活監視 — 壊れた実体を外す仕組み』の nginx は実リクエストの失敗を数え、既定は max_fails が 1、fail_timeout が 10秒。「10秒の間に1回失敗したら、10秒間そのサーバを使わない」でした。
ここに窓があります。失敗を即反映せず10秒の区間にまとめて数えるのは測定の粒度そのもの。外した後の10秒は効果を待つ区間で cooldown と同じです。
段 増やす 外す(nginx)測定 粒度 既定5分 fail_timeout の窓 既定10秒判断 安定化ウィンドウ HPA 既定300秒 max_fails 既定1 に達したか起動 warmup 既定値なし・既定で無効 fail_timeout 後にそのまま復帰
どちらも現在ではなく「少し前の区間にまとめた状態」で決めます。方向が逆なだけで遅れ方は同じです。
「オートスケールには5分のクールダウンがある」という説明は、AWS の文書に照らして妥当ですか。
増やす — 借りた台数を動かす
負荷が足りているかは直接は分かりません。CPU 使用率のような代理の値を一定区間にまとめた点で受け取り、目標から離れたら台数を動かします。効果が値に現れるのは新しい実体が集計に寄与してからです。
送りすぎない — 経路が耐えられる量を推定する(第24週)
第24週『送りすぎない仕組み — フロー制御と輻輳制御の違い』で見たとおり、従来の TCP は混雑を損失や ACK の遅れから推定します。明示通知(ECN、RFC 3168)もありますが、経路と両端が対応している場合に限られます。小さく始めて増やし、損失の兆候が出たら下げる繰り返しです。
増やす・外す・絞る。いずれも信号に遅れて動きます。この遅れを設定で縮めきれない理由は何でしょうか。
「遅れを縮める」と「判断を安定させる」が同じ設定値の両側にあることに注目を。
上限は、物理の有限性から来る
遅れとは別に、増やせる量の上限が2種類あります。1つは自分のクォータで、"If you attempt to exceed the quota for a resource, the request fails." と書かれ、引き上げを要求できます。もう1つは事業者側に空きが無いときのエラーで、対処に "submit a new request without specifying an Availability Zone." が挙がります。
ゾーンを指定しないよう勧められること自体が、容量が場所ごとに偏る傍証です。 借りた先は有限な他人の機械で、2つ目は自分では上げられません。
この章のまとめ
- 「自動で増える」は測定 → 判断 → 起動の3段。効くのは3つの遅れの和だけ後。
- EC2 の既定粒度は5分(ステータスチェックのみ1分)。細かく測ることには値段が付いている。
- cooldown の既定300秒は simple scaling policy の値で、AWS 自身が使わないよう推奨している。「オートスケールは5分待つ」と一般化しない。
- instance warmup に既定値は無く、既定では有効ですらない。 300秒は出発点の推奨にすぎない。
- HPA は既定15秒周期の離散ループ。減らす側は既定300秒の安定化ウィンドウ、増やす側は無しで即時。
- 上限は2種類。自分のクォータ(引き上げ要求できる)と事業者の容量不足(できない)。
- 台数を増やしても共有する下流は増えない。代理指標が揃うことは負荷が捌けることを意味しない。
この先の学びにどう繋がるか
次は増やす単位が小さくなるとどうなるか — サーバレスと microVM、コンテナと VM の合流点。起動の遅れが設計の中心に来ます。
クイズで手を動かすなら「開発とツール」群の『AWS III(コンテナとサーバーレス)』『Kubernetesの基礎』、「システム性能分析」群の『性能分析XI(クラウド環境の性能)』が対応します。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
Kubernetes の HorizontalPodAutoscaler について、公式文書(v1.37 時点)の記述として正しいものはどれですか。
用語集(4語)
- メトリクス粒度(period)
- 監視の値が「何秒ぶんをまとめた1点」として届くか。短い変動は薄まる。EC2 の既定は5分、ステータスチェックは1分。
- cooldown
- 直前の効果が見えるまで次を待たせる期間。simple scaling policy の仕組みで既定300秒。AWS 自身が使わないよう推奨。
- instance warmup
- 起動した実体が集計対象のメトリクスに寄与し始めるまでの待ち時間。既定で有効でなく既定値も無い。目安が不明なら300秒から始めるとされる。
- 安定化ウィンドウ
- HPA が過去一定期間の希望状態の最大値を採り、振動を抑える仕組み。既定でダウンは300秒、アップには無い。
出典(一次ソース)
- Amazon EC2 User Guide — Manage detailed monitoring for your EC2 instances ↗
- Amazon EC2 Auto Scaling — Scaling cooldowns ↗
- Amazon EC2 Auto Scaling — Set the default instance warmup ↗
- Kubernetes — Horizontal Pod Autoscaling ↗
- Amazon EC2 User Guide — Troubleshoot instance launch issues ↗
- Amazon EC2 User Guide — Amazon EC2 service quotas ↗
- RFC 3168 — The Addition of Explicit Congestion Notification (ECN) to IP ↗