接口一慢就扩容,多半扩错了地方
【摘要】 扩容是所有止血手段里最快的一个,所以它经常被用在还没查清楚的时候。连接池打满时加两台机器,效果通常是把排队从一台机器挪到两台机器。一、先分清是「池满」还是「库慢」大多数「连接池不够」的判断,是从监控上看到活跃连接数接近上限得出的。这个数字只说明在忙,不说明不够用。看等待,不只看活跃:活跃连接高是常态,获取连接的等待时长高才是真信号。前者说明在干活,后者说明在排队。把两段时间拆开:一次请求的耗...
扩容是所有止血手段里最快的一个,所以它经常被用在还没查清楚的时候。连接池打满时加两台机器,效果通常是把排队从一台机器挪到两台机器。
一、先分清是「池满」还是「库慢」
大多数「连接池不够」的判断,是从监控上看到活跃连接数接近上限得出的。这个数字只说明在忙,不说明不够用。
- 看等待,不只看活跃:活跃连接高是常态,获取连接的等待时长高才是真信号。前者说明在干活,后者说明在排队。
- 把两段时间拆开:一次请求的耗时 = 等连接 + 执行 SQL + 业务处理。比例拿不出来,后面所有优化都是猜。
- 池大不等于快:池开到 200 而库只能并发跑 50,多出来的 150 个连接只是在数据库里排队,还会把库压得更慢。
判据:慢的时候,能说出等连接与执行 SQL 各占多少时间。
二、池的大小由下游倒推,不由应用拍
连接池的上限不是应用自己的参数,它是数据库并发预算的一部分。
- 从库的上限往回算:按实例的最大连接数留出运维、批处理、迁移的口子,业务可用部分取七成左右。
- 算总量而不是单实例:总连接数 = 单实例池大小 × 实例数。滚动发布、弹性扩容期间会短暂翻倍,预算要按最坏情况算。
- 连接复用优先于加连接:短连接改长连接、合理设置空闲回收,比把 max-active 调大有效得多。
判据:实例数翻倍时,总连接数仍在库上限的七成以内。
三、多数「池不够」,其实是没还
连接泄漏的形态很稳定:曲线只涨不落。它往往不是忘了 close,而是被别的东西占住了。
- 事务里做远程调用:一次 HTTP 或消息发送几百毫秒,连接就被一直占着。事务边界要包住 SQL,不要包住网络。
- 长事务:批量任务、导出、后台补偿,跑得越久占用越久,池再大也会被吃满。
- 异常路径没兜住:try 里拿到连接、catch 里没归还,平时看不出来,一出错就开始漏。
判据:压测一轮结束后,活跃连接数能回到基线,而不是停在高位。
落到华为云上:连接数上限与参数调整在云数据库 RDS for MySQL / TaurusDB 的参数组里看,改之前先确认实例规格对应的上限;会话与慢 SQL 用数据管理服务 DAS 直接看当前连接在跑什么;等连接的时间从应用性能管理 APM 的调用链里拆;容器侧按实例数核对池配置用云容器引擎 CCE 的工作负载参数;弹性伸缩的触发条件建议挂连接等待或 P99,而不是 CPU。
一张表收尾
| 症状 | 通常是 | 先补这个 |
|---|---|---|
| 扩容后仍然慢 | 瓶颈在库,不在应用 | 看库侧并发与慢 SQL |
| 活跃连接只涨不落 | 连接没还 | 查事务里的远程调用与异常路径 |
| 高峰期大量等连接 | 池小于真实并发 | 按库上限倒推池大小 |
| 实例一多库就告警 | 池大小 × 实例数超上限 | 做全局连接预算 |
参考
- 华为云 · 云数据库 RDS for MySQL
- 华为云 · 云数据库 TaurusDB
- 华为云 · 数据管理服务 DAS
- 华为云 · 应用性能管理 APM
- 华为云 · 云容器引擎 CCE
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)