Skip to content
应用运行时异常排查 · 第 3 篇 / 共 4 篇
领域生产问题
专题应用运行时排障专题
当前序列应用运行时异常排查
阅读位置第 3 篇 / 共 4 篇当前专题第 1 个序列 / 共 3 个序列

生产问题:线程池打满时怎么排查

线程池问题很典型的一种表现是:

  • 请求变慢
  • 接口超时
  • 日志里开始出现任务拒绝

但线程池打满这件事本身通常不是根因,而是业务执行模型、队列策略、下游慢调用一起暴露出来后的结果。

先说结论

线程池打满时,不要只盯着“线程数够不够”,而要一起看:

  • 队列是不是堆满了
  • 线程到底在忙什么
  • 是任务执行慢,还是下游阻塞

更重要的是先分清:

  • 池子满是因为任务太多
  • 还是因为任务不释放
  • 还是因为一个池子混跑了太多不同类型的任务

一、常见现象

典型现象包括:

  • 请求堆积
  • 拒绝策略触发
  • CPU 可能并不高,但服务已经明显变慢

还经常伴随:

  • 接口 RT 飙升
  • 异步任务延迟越来越高
  • 业务日志出现 RejectedExecutionException
  • 线程池队列越来越长

二、先看什么

优先确认:

  • 核心线程数
  • 最大线程数
  • 队列长度
  • 拒绝策略

很多问题不是线程数太小,而是:

  • 无界队列把延迟拖长了
  • 下游调用卡住导致线程一直不释放

还要看:

  • 活跃线程数是否一直打满
  • 已完成任务数有没有明显下降
  • 队列是不是只进不出

三、最常见根因

  • 数据库连接慢
  • 远程接口超时
  • 单个任务执行时间过长
  • 一个线程池混跑太多不同任务

更具体一些,线上高频根因通常是:

1. 下游阻塞把线程一直占住

任务不是在算,而是在等数据库、Redis、HTTP、MQ、锁。

2. 无界队列掩盖了容量问题

线程数看起来没报错,但队列越积越长,最终整体延迟越来越高。

3. 线程池共用过度

接口请求、批量任务、定时任务、回调任务混在一个池子里,互相拖垮。

4. 拒绝策略没有按业务设计

出了问题后,不是快速失败,而是继续把调用链拖住。

四、怎么处理更稳

通常的方向是:

  • 把不同业务类型拆成不同线程池
  • 给外部调用加超时
  • 队列容量明确设边界
  • 拒绝策略明确可控

五、一个更现场化的排查顺序

如果线上已经出现线程池打满,我通常按这个顺序看:

  1. 先看活跃线程数、队列长度、拒绝次数。
  2. 看线程到底在忙什么,是执行中还是等待下游。
  3. 看是不是某个任务类型突然变重或流量变大。
  4. 看数据库、Redis、HTTP 下游是否同步变慢。
  5. 最后再决定是拆线程池、降级任务、限流,还是调整容量参数。

这个顺序的重点是先找“为什么线程不释放”,而不是一上来只加线程数。

一句话总结

线程池打满往往不是线程池本身的问题,而是它帮你把下游阻塞、任务过重、队列无边界和容量设计不合理这些问题一起暴露出来了。先看线程在做什么,再看线程池该怎么配,效果通常会更稳。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读接口 RT 飙升但 CPU 不高时怎么排查适合把 CPU、Full GC、线程池和接口超时这类应用层异常放在一组里看。应用运行时排障专题 · 应用运行时异常排查同一序列 · 回看前文会更完整Full GC 频繁时怎么排查适合把 CPU、Full GC、线程池和接口超时这类应用层异常放在一组里看。应用运行时排障专题 · 应用运行时异常排查同专题其他序列 · 共享标签:并发、线上排障线程池积压时怎么判断是慢任务还是流量放大适合把线程死锁、CPU 高、Full GC、接口超时和 OOM 现场保留放在一条运行时排障主线上看。应用运行时排障专题 · 应用运行时故障的现场与根因收敛同专题其他序列 · 共享标签:线上排障、案例排障接口超时排查为什么要区分 RT 和 queue wait适合把线程死锁、CPU 高、Full GC、接口超时和 OOM 现场保留放在一条运行时排障主线上看。应用运行时排障专题 · 应用运行时故障的现场与根因收敛跨专题关联 · 共享标签:并发、线上排障数据库死锁和锁等待超时案例怎么复盘适合把 K8s、RabbitMQ 和数据库锁等待问题放在一条故障治理主线上看。数据与基础设施排障专题 · 基础设施与中间件故障案例跨专题关联 · 共享标签:并发、线上排障MySQL 死锁怎么排查适合把事务锁、死锁、主从复制、写后读一致性和切换治理串起来看。MySQL 专题 · MySQL 事务、锁与高可用
继续阅读应用运行时异常排查当前序列第 3 篇 / 共 4 篇当前专题第 1 个序列 / 共 3 个序列
往前看
上一篇Full GC 频繁时怎么排查回到当前序列上一章上一序列业务稳定性与治理实践从第 1 篇开始:支付回调幂等到底该怎么落地
往后看
下一篇接口 RT 飙升但 CPU 不高时怎么排查继续当前序列下一章下一序列应用运行时典型故障案例从第 1 篇开始:Redis 热 Key 突增时怎么止血和回查

把零散经验整理成可查、可复用、可持续更新的企业级知识门户