PostgreSQL 在AWS的 T 系列实例上的性能陷阱

很多人刚上 AWS 时,为了节省成本,会选择:

复制代码
t3 / t4g 系列实例

看起来:

  • vCPU 多(比如 8核)

  • 内存够用

  • 价格便宜

于是直接用来跑 PostgreSQL 主库。

👉 这是一个非常隐蔽但致命的坑。


一、典型问题现象

生产环境常见表现:

复制代码
load 很高(> CPU核数)
CPU 使用率 100%
数据库卡顿
pg_basebackup 很慢
checkpoint 抖动
iowait 偶尔升高

甚至你会看到:

复制代码
CPU 满了,但 QPS 上不去

二、核心原因:T 系列 CPU 是"限速"的

t4g.2xlarge 为例:

复制代码
8 vCPU
baseline ≈ 40%

换算:

复制代码
8 × 40% = 3.2 vCPU

👉 真实情况:

长期只能稳定使用 ≈ 3.2 核,而不是 8 核


三、CPU Credit:隐形限速器

T 系列依赖:

复制代码
CPU Credit

机制:

  • 平时积累

  • 使用时 burst

  • 用完 → 限速


当 credit 用完后

复制代码
CPUCreditBalance = 0

👉 CPU 会被限制到:

复制代码
≈ 3.2 vCPU

四、为什么 load 会异常升高(重点)

很多人看到:

复制代码
load = 13
CPU = 100%

会误以为:

👉 CPU 不够

其实更准确是:

👉 CPU 被限制,导致 load 被放大


load 的本质

复制代码
load = 正在运行 + 等待CPU + 等待IO 的进程数

👉 排队越多,load 越高


T 系列的"限速"不是降频(非常关键)

❌ 不是 CPU 降频

✔ 是 CPU 时间片限制(调度层)

可以理解为:

复制代码
你有 8 核
但每个核只能用 40% 时间

👉 等价于:

复制代码
≈ 3.2 个真实 CPU

举个非常直观的例子

正常实例(m6g)

复制代码
任务数:8
CPU:8核

👉 不排队:

复制代码
load ≈ 8

T 系列(credit 用完)

复制代码
任务数:8
CPU:≈3.2核

👉 只能跑 3.2 个:

复制代码
8 - 3.2 = 4.8 在排队

👉 load:

复制代码
≈ 13

👉 这就是你看到:

复制代码
load 爆炸(13+)

的真正原因


五、PostgreSQL 为什么更容易踩坑

PostgreSQL:

复制代码
多进程模型(process-based)

例如:

  • 每个连接一个进程

  • autovacuum

  • walwriter

  • checkpointer

👉 对 CPU 非常敏感


CPU 不够会发生什么

1️⃣ 进程排队

复制代码
vmstat r > CPU

2️⃣ WAL 写变慢

复制代码
commit 延迟上升

3️⃣ checkpoint 拉长

复制代码
写放大

4️⃣ iowait 被误判(经典坑)

很多人看到:

复制代码
iowait ↑

以为是:

👉 磁盘问题

实际上:

复制代码
CPU 忙 → IO处理慢 → 看起来像 IO 等待

六、典型误判链路

很多团队会这样排查:

复制代码
数据库慢
→ 看 iowait 高
→ 提升 IOPS
→ 问题依旧
→ 怀疑 SQL
→ 调参数
→ 还是慢

👉 最终发现:

复制代码
CPUCreditBalance = 0

七、如何快速确认这个问题

1️⃣ AWS 指标

复制代码
CPUCreditBalance = 0
CPUCreditUsage 持续高

2️⃣ vmstat

复制代码
vmstat 1

判断:

复制代码
r > vCPU
id ≈ 0

👉 CPU 不够


3️⃣ top

复制代码
load > CPU核数

4️⃣ PostgreSQL

复制代码
SELECT wait_event FROM pg_stat_activity;

出现:

复制代码
WALWrite
DataFileWrite

八、真实案例(典型)

复制代码
load: 13
CPU: 100%
CPUCreditBalance: 0
vmstat r: 10+

换算:

复制代码
实际需求 ≈ 6~7 CPU
可用 ≈ 3.2 CPU

👉 差距 ≈ 2倍


九、为什么 T 系列不适合 PostgreSQL

❌ 1. CPU 不稳定

复制代码
burst → 限速

❌ 2. IO 被 CPU 拖累

复制代码
IO 看起来慢,其实是 CPU 慢

❌ 3. 性能不可预测

复制代码
什么时候掉速无法控制

十、正确选型建议

推荐实例

类型 实例
通用 m6g / m7g
数据库(推荐) r6g / r7g

为什么 r 系列更好

复制代码
内存大 → cache命中高 → IO减少

十一、什么时候可以用 T 系列?

仅限:

复制代码
开发环境
低 QPS
短任务
非核心业务

十二、一句话总结

T 系列不是"慢 CPU",而是"少 CPU",因此 load 会被严重放大,而 PostgreSQL 是最容易被这种机制放大的数据库。


十三、最终建议

如果你已经看到:

复制代码
load 高 + CPU 满 + credit 为 0

👉 不要再调参数

👉 直接换实例(m6g / r6g)


相关推荐
m0_746752302 小时前
bootstrap怎么给表格添加固定表头效果
jvm·数据库·python
justjinji2 小时前
JavaScript 数组引用陷阱与“破纪录”问题的正确解法
jvm·数据库·python
m0_674294642 小时前
mysql如何通过yum源快速安装_mysql官方yum安装教程
jvm·数据库·python
justjinji2 小时前
如何在Node.js中封装通用的MongoDB CRUD操作层_基于原生驱动的DAO层设计模式
jvm·数据库·python
梦想的旅途22 小时前
企微自动化办公:实现外部群聊的高级交互逻辑
运维·数据库·自动化·企业微信·rpa
abc123456sdggfd2 小时前
php怎么实现API网关聚合_php如何将多个微服务接口合并响应
jvm·数据库·python
LiAo_1996_Y2 小时前
JavaScript中类属性与原型属性的覆盖规则详解
jvm·数据库·python
2301_817672262 小时前
如何修改Oracle服务器的主机名_listener和tnsnames同步调整
jvm·数据库·python
snow@li10 小时前
数据库:市场中都有哪些数据库 / 优缺点 使用情况
数据库