在使用 AWS EC2 T 系列实例(如 t4g / t3)时,经常会遇到:
-
CPU 使用率很高
-
load 很高(> CPU 核数)
-
PostgreSQL / 应用变慢
-
但又不确定是不是 CPU 不够
本文通过 AWS CLI + 系统指标,教你如何一步步证明:
👉 你的 CPU 不够(而且是被 CPU Credit 限制)
有个比较简单的方法

这里一直是0的话,说明额度一直是空的,也就是一直被消耗
可以是额度正好被消耗完,也可以是消耗 > 额度
一、T 系列 CPU 的本质(必须理解)
以 t4g.2xlarge 为例:
8 vCPU,但 baseline 只有 40%
换算:
8 × 40% = 3.2 vCPU(长期可用)
👉 也就是说:
这台 8核机器,长期性能 ≈ 3.2核
二、核心指标 1:CPUCreditBalance(最关键)
查询命令
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUCreditBalance \
--dimensions Name=InstanceId,Value=你的实例ID \
--statistics Average \
--period 60 \
--start-time 2026-04-22T00:00:00Z \
--end-time 2026-04-22T23:59:59Z
如何判断
| 数值 | 含义 |
|---|---|
| > 100 | CPU 有余量 |
| 持续下降 | 正在透支 CPU |
| ≈ 0 | ❗ CPU 已被限制 |
本次优化查询的数据
bash
{
"Label": "CPUCreditBalance",
"Datapoints": [
{
"Timestamp": "2026-04-22T00:55:00+00:00",
"Average": 0.0,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T16:50:00+00:00",
"Average": 0.0,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T02:40:00+00:00",
"Average": 0.0,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T18:35:00+00:00",
"Average": 0.0,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T02:05:00+00:00",
"Average": 0.0,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T20:20:00+00:00",
"Average": 0.0,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T03:50:00+00:00",
"Average": 0.0,
"Unit": "Count"
},
.........
关键结论
CPUCreditBalance = 0
👉 表示:
CPU 已经不能再 burst,只能用 baseline(≈3.2核)
三、核心指标 2:CPUCreditUsage(算出真实 CPU 需求)
查询命令
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUCreditUsage \
--dimensions Name=InstanceId,Value=你的实例ID \
--statistics Sum \
--period 300 \
--start-time 2026-04-22T00:00:00Z \
--end-time 2026-04-22T23:59:59Z
如何计算真实 CPU
这个指标是:
5分钟内消耗的 CPU credit
换算公式:
CPU核数 ≈ credit / 5
示例
bash
{
"Label": "CPUCreditUsage",
"Datapoints": [
{
"Timestamp": "2026-04-22T00:55:00+00:00",
"Sum": 30.0007428,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T16:50:00+00:00",
"Sum": 33.16712308333334,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T02:40:00+00:00",
"Sum": 26.27567871666667,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T18:35:00+00:00",
"Sum": 35.062843916666665,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T02:05:00+00:00",
"Sum": 33.40315138333333,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T20:20:00+00:00",
"Sum": 35.161372566666664,
"Unit": "Count"
},
{
"Timestamp": "2026-04-22T03:50:00+00:00",
"Sum": 17.962388716666666,
"Unit": "Count"
},
........
如果看到:
30 credit / 5分钟
那么:
30 / 5 = 6 CPU
👉 说明:
业务需要 6 个真实 CPU
对比 baseline
t4g.2xlarge baseline = 3.2 CPU
实际需求 ≈ 6 CPU
👉 差距:
6 - 3.2 = 2.8 CPU(不足)
四、辅助指标 3:CPUUtilization(确认 CPU 打满)
查询命令
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=你的实例ID \
--statistics Average Maximum \
--period 60 \
--start-time 2026-04-22T00:00:00Z \
--end-time 2026-04-22T23:59:59Z
判断
Average > 80%
Maximum ≈ 100%
👉 表示:
CPU 已经被打满
五、可选指标(Unlimited 模式)
如果你的实例是 Unlimited 模式,可以查:
1. 超额 CPU(欠债)
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUSurplusCreditBalance \
--dimensions Name=InstanceId,Value=你的实例ID \
--statistics Average \
--period 300 \
--start-time 2026-04-22T00:00:00Z \
--end-time 2026-04-22T23:59:59Z
2. 被收费的超额 CPU
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUSurplusCreditsCharged \
--dimensions Name=InstanceId,Value=你的实例ID \
--statistics Sum \
--period 300 \
--start-time 2026-04-22T00:00:00Z \
--end-time 2026-04-22T23:59:59Z
六、系统层面验证(强烈建议)
1. vmstat
vmstat 1
重点看:
r = 等 CPU 的进程数
判断
如果:
r > CPU核数
👉 CPU 不够
2. top
top
看:
id ≈ 0
load > CPU核数
👉 CPU 已经满载 + 排队
七、最终判断公式(核心总结)
如果你看到:
CPUCreditBalance = 0
+ CPUCreditUsage 很高
+ CPUUtilization ≈ 100%
+ vmstat r > vCPU
+ load > vCPU
👉 可以 100% 确认:
CPU 不够(而且是被 T 系列 credit 限制)
八、结论与建议
当前问题本质
不是机器太弱
而是 T 系列 CPU 被限速
推荐方案
| 场景 | 推荐实例 |
|---|---|
| 通用 | m6g / m7g |
| 数据库(推荐) | r6g / r7g |
一句话总结
T 系列不是"低配机器",而是"限速机器",CPU credit 用完后性能会骤降。