T3インスタンスのCPUクレジットを理解する:バースト性能と突然の速度低下の原因
本番環境でT3インスタンスを運用していると、ある時点から突然レスポンスタイムが悪化し、CPUが張り付いたように動かなくなる現象に遭遇することがある。アプリケーションのバグを疑い、メモリリークを調査し、それでも原因が見つからない。実はその原因がCPUクレジットの枯渇だったというケースは、T3インスタンスを使い始めたエンジニアが最初にはまる落とし穴の一つだ。
TL;DR:T3インスタンスのCPUクレジット早見表
| 項目 | 内容 |
|---|---|
| CPUクレジットとは | ベースライン未満のCPU使用時に蓄積し、バースト時に消費するトークン |
| クレジット枯渇時の挙動 | CPUパフォーマンスがベースラインに制限される(Standardモード) |
| Unlimitedモード | クレジット枯渇後も性能を維持するが、余剰クレジット分が課金される |
| 診断の起点 | CloudWatchのCPUCreditBalanceメトリクスを確認する |
| 主なリスク | Unlimitedモードでの予期しない追加料金 |
T3インスタンスのCPUクレジット機構:仕組みから理解する
T3インスタンスはバースト可能なパフォーマンスインスタンスファミリーに属する。「バースト可能」とは、常時高いCPU性能を保証するのではなく、ベースラインCPU使用率を定義し、それを下回る期間にクレジットを蓄積し、高負荷時にそのクレジットを消費して一時的に高い性能を発揮できる仕組みを指す。
各T3インスタンスタイプにはベースラインCPU使用率が定められており、例えばt3.microであれば10%、t3.smallであれば20%といった値が設定されている(正確な値はAWS公式ドキュメントを参照)。インスタンスがベースラインを下回るCPU使用率で稼働している間、1時間あたり一定数のCPUクレジットが自動的に付与される。逆にベースラインを超えてCPUを使用すると、クレジットが消費される。
CPUクレジットは銀行口座の残高に似ている。低負荷期間に少しずつ貯金し、高負荷時に引き出す。残高がゼロになれば、それ以上の引き出しはできない。
クレジットには上限(最大蓄積量)があり、インスタンスタイプによって異なる。上限に達したクレジットはそれ以上蓄積されない。また、T3インスタンスは起動時にある程度のクレジットを持った状態でスタートする。
初期クレジット付与"] --> B{"CPU使用率 vs ベースライン"} B -->|"使用率 < ベースライン"| C["CPUクレジット蓄積
残高が増加"] B -->|"使用率 > ベースライン"| D["CPUクレジット消費
残高が減少"] C --> E{"残高が上限に達した?"} E -->|"Yes"| F["蓄積停止
上限でキャップ"] E -->|"No"| B D --> G{"残高 > 0 ?"} G -->|"Yes(Standardモード)"| H["バースト継続"] G -->|"No(Standardモード)"| I["CPUをベースラインに制限
速度低下発生"] G -->|"No(Unlimitedモード)"| J["バースト継続
余剰クレジット課金発生"] H --> B F --> B
- クレジット蓄積フェーズ:CPU使用率がベースラインを下回っている間、クレジットが継続的に付与される。
- バーストフェーズ:CPU使用率がベースラインを超えると、超過分に対してクレジットが消費される。
- クレジット枯渇(Standardモード):残高がゼロになると、CPUパフォーマンスはベースラインに制限される。これが突然の速度低下の正体だ。
- Unlimitedモード:クレジットが枯渇しても性能を維持するが、ベースラインを超えた使用分は余剰クレジットとして後払いで課金される。
StandardモードとUnlimitedモードの違い
T3インスタンスはデフォルトでUnlimitedモードで起動する。これはT2インスタンスのデフォルト(Standardモード)とは異なる点に注意が必要だ。
| モード | クレジット枯渇後の挙動 | 追加料金 | T3デフォルト |
|---|---|---|---|
| Standard | CPUがベースラインに制限される | なし | いいえ |
| Unlimited | CPUパフォーマンスを維持する | 余剰クレジット分が課金される | はい |
Unlimitedモードは便利に見えるが、継続的な高負荷ワークロードをT3インスタンスで動かすと、余剰クレジット課金が積み重なり、より上位のインスタンスタイプを使うよりもコストが高くなることがある。これは実際の運用でよく見落とされるコスト最適化の盲点だ。
CPUクレジット枯渇の診断:3ステップ
「なぜサーバーが遅くなったのか」を調査する際、最初に確認すべきはCPUCreditBalanceメトリクスだ。アプリケーションログやメモリ使用率を先に見てしまうと、原因特定に時間がかかる。
ステップ1:CPUCreditBalanceでクレジット残高の推移を確認する
速度低下が発生した時刻と、CPUCreditBalanceがゼロに近づいた時刻が一致するかどうかを確認する。これが一致すれば、クレジット枯渇が原因である可能性が高い。
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUCreditBalance \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-15T23:59:59Z \
--period 300 \
--statistics Average \
--region us-east-1
ステップ2:CPUCreditUsageでクレジット消費速度を確認する
残高の低下速度だけでなく、どの時間帯にクレジットが急速に消費されたかを把握することで、負荷のパターンが見えてくる。バッチ処理の実行時刻やデプロイのタイミングと照合すると原因が絞り込みやすい。
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUCreditUsage \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-15T23:59:59Z \
--period 300 \
--statistics Sum \
--region us-east-1
ステップ3:CPUSurplusCreditsChargedメトリクスで余剰課金を確認する
Unlimitedモードで運用している場合、クレジット枯渇後の高負荷継続によって余剰クレジットが発生し課金される。このメトリクスが継続的に増加しているなら、インスタンスタイプの見直しを検討すべきシグナルだ。
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUSurplusCreditsCharged \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-15T23:59:59Z \
--period 3600 \
--statistics Sum \
--region us-east-1
残高がゼロに近いか?"] B -->|"Yes"| C["Step2: CPUCreditUsage確認
急消費の時間帯を特定"] B -->|"No"| Z["別の原因を調査
(メモリ・DB・ネットワーク)"] C --> D["Step3: CPUSurplusCreditsCharged確認
Unlimitedモードの余剰課金を検出"] D --> E{"CPUSurplusCreditsCharged
が継続増加?"} E -->|"Yes"| F["インスタンスタイプ
アップグレードを検討"] E -->|"No"| G["Standardモード切替
またはアラーム設定"]
- CPUCreditBalance確認:速度低下発生時刻とクレジット残高ゼロのタイミングが一致するか検証する。
- CPUCreditUsage確認:クレジットが急速に消費された時間帯を特定し、負荷イベントと照合する。
- CPUSurplusCreditsCharged確認:Unlimitedモードでの余剰課金発生を検出し、コスト影響を評価する。
実際の障害パターン:誤診から正しい原因特定へ
あるケースでは、夜間バッチ処理の完了後から翌朝にかけてAPIレスポンスタイムが急激に悪化するという問題が発生した。アプリケーションチームはまずデータベースのスロークエリを疑い、次にメモリリークを調査した。どちらも問題なし。
実際の原因は、夜間バッチがCPUクレジットをほぼ全て消費していたことだった。翌朝の業務開始時にはクレジット残高がほぼゼロの状態で、通常のAPIリクエストを処理しようとしてもCPUがベースラインに制限されたまま動けない状態になっていた。
CloudWatchでCPUCreditBalanceの24時間グラフを表示した瞬間、バッチ開始時刻から残高が急落し、バッチ終了時点でほぼゼロになっているパターンが一目で確認できた。アプリケーションログには何も記録されていない。CPUが制限されているだけで、エラーは発生していないからだ。
これがCPUクレジット枯渇の厄介な点で、アプリケーション層には一切エラーが出ない。ただ遅くなるだけだ。
対処方法:状況に応じた選択肢
選択肢A:Standardモードに切り替えてコストを予測可能にする
継続的な高負荷ではなく、予算の上限を優先したい場合はStandardモードへの変更を検討する。クレジット枯渇後はパフォーマンスが制限されるが、予期しない課金は発生しない。
aws ec2 modify-instance-credit-specification \
--instance-credit-specifications InstanceId=i-1234567890abcdef0,CpuCredits=standard \
--region us-east-1
選択肢B:インスタンスタイプをアップグレードする
CPUSurplusCreditsChargedが継続的に発生しているなら、T3インスタンスのバースト前提の設計がワークロードに合っていない。m5やc5といった固定パフォーマンスインスタンスへの移行を検討する。余剰クレジット課金が積み重なるよりも、適切なインスタンスタイプを選ぶ方がトータルコストで有利になることが多い。
選択肢C:CloudWatchアラームでクレジット残高を監視する
問題が発生する前に検知するために、CPUCreditBalanceに対してアラームを設定する。残高が一定値を下回った段階で通知を受け取ることで、枯渇前に対処できる。
aws cloudwatch put-metric-alarm \
--alarm-name t3-cpu-credit-low \
--alarm-description 'T3 CPU Credit Balance is low' \
--metric-name CPUCreditBalance \
--namespace AWS/EC2 \
--statistic Average \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--period 300 \
--evaluation-periods 3 \
--threshold 20 \
--comparison-operator LessThanThreshold \
--alarm-actions arn:aws:sns:us-east-1:123456789012:ops-alert \
--region us-east-1
T3インスタンスのCPUクレジット監視:まとめと次のステップ
T3インスタンスのCPUクレジット機構を理解することは、バースト性能インスタンスを正しく運用するための基礎だ。突然の速度低下の原因がCPUクレジット枯渇であることを素早く診断できるかどうかは、CloudWatchメトリクスを日常的に監視しているかどうかにかかっている。
- 本番T3インスタンス全てに
CPUCreditBalanceのCloudWatchアラームを設定する - Unlimitedモードで運用中のインスタンスは
CPUSurplusCreditsChargedを定期的に確認する - 継続的な高負荷ワークロードには固定パフォーマンスインスタンスへの移行を検討する
- 詳細はAWS公式ドキュメント:バースト可能なパフォーマンスインスタンスを参照
用語集
| 用語 | 説明 |
|---|---|
| CPUクレジット | T3などのバースト可能インスタンスがベースラインCPU使用率を下回って稼働した時間に応じて蓄積されるトークン。バースト時に消費される。 |
| ベースラインCPU使用率 | 各T3インスタンスタイプに定義された標準的なCPU使用率の上限。これを超えるとクレジットが消費される。 |
| Standardモード | クレジット枯渇後にCPUパフォーマンスをベースラインに制限するモード。追加課金なし。 |
| Unlimitedモード | クレジット枯渇後も性能を維持するモード。超過分は余剰クレジットとして課金される。T3のデフォルト。 |
| CPUSurplusCreditsCharged | Unlimitedモードでクレジット残高がゼロの状態でバーストした際に課金される余剰クレジット量を示すCloudWatchメトリクス。 |
コメント
コメントを投稿