$ cat tech-share.md

星图 App 接口超时排障复盘

一次连接池耗尽引发的 P1

张三2026-10-13
排障postgres性能
TL;DR根因是数据库连接池上限 20 被慢查询占满;加索引 + 池扩容 + 超时熔断后 p99 从 8.2s 降到 180ms。

Python 3.12FastAPIPostgreSQL 16RedisCloudflare

现象

10-12 21:40 起,/api/orders p99 从 200ms 飙到 8.2s,错误率 6%。

定位

连接池指标显示 20/20 占满,等待队列持续增长。抓慢查询:

sql
SELECT * FROM orders
WHERE user_id = $1 AND status = 'paid'
ORDER BY created_at DESC LIMIT 20;
-- Seq Scan on orders  (cost=0.00..48211.00)

修复

加复合索引,池上限提到 50,并给下游调用加 2s 超时。

sql
CREATE INDEX CONCURRENTLY idx_orders_user_status_created
  ON orders (user_id, status, created_at DESC);
警告 生产建索引一定用 CONCURRENTLY,否则会锁表。

教训

命令速查

psql -c "SELECT * FROM pg_stat_activity WHERE state='active'"看正在跑的查询
EXPLAIN (ANALYZE, BUFFERS) <query>看真实执行计划

参考链接