$ cat tech-share.md
星图 App 接口超时排障复盘
一次连接池耗尽引发的 P1
排障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,否则会锁表。教训
- 新查询上线前必须过
EXPLAIN ANALYZE - 连接池占用率 > 80% 要告警
命令速查
psql -c "SELECT * FROM pg_stat_activity WHERE state='active'" | 看正在跑的查询 |
EXPLAIN (ANALYZE, BUFFERS) <query> | 看真实执行计划 |