线程池核心 / 最大线程数计算(数据库 IO 密集型接口)

📅 2026/6/29 19:17:31
线程池核心 / 最大线程数计算(数据库 IO 密集型接口)
目录已知条件1. 先算稳态需要并发线程数2. 核心线程数corePoolSize3. 最大线程数maximumPoolSize补充边界校验4. 配套队列关键配置极易踩坑推荐队列参数最终推荐配置补充说明已知条件单任务耗时200ms 0.2s峰值 QPS100场景IO 密集型数据库查询阻塞等待 DBCPU 空闲1. 先算稳态需要并发线程数每秒 100 请求每个请求占用线程 0.2s 单线程每秒处理请求数 1 / 0.2 5 QPS/线程稳态所需最小并发线程 总QPS / 单线程吞吐量 100 / 5 20也就是说稳定跑 100QPS 至少要 20 个并发线程少于 20 线程会出现排队堆积、响应拉长。2. 核心线程数corePoolSize核心线程是常驻不回收的目标扛住日常平稳流量避免频繁创建销毁线程平稳流量按峰值 70% 估算100 * 0.7 70QPS对应线程70 / 5 14 推荐核心线程数 1520取 20 最优平稳 100QPS 时无需新建临时线程无线程创建开销3. 最大线程数maximumPoolSize要预留流量突增缓冲一般预留 30%~50% 冗余防毛刺、瞬时脉冲流量 基准 20 线程上浮 50% 冗余20 * 1.5 30 推荐最大线程数 2530补充边界校验如果瞬时冲到 150QPS 需要线程 150 / 5 30刚好覆盖峰值毛刺。4. 配套队列关键配置极易踩坑线程池执行顺序核心线程 → 阻塞队列 → 新建最大线程 → 拒绝策略若队列设置过大如 1000流量突增不会创建新线程全部塞队列接口排队超时若队列 0流量一涨直接开最大线程波动大推荐队列参数队列容量设置为峰值 1 秒请求量的一半50逻辑少量突增先丢队列缓冲超出 50 才启用扩容线程平衡线程创建与排队延迟。拒绝策略CallerRunsPolicy让调用者线程执行限流保护 DB避免雪崩。最终推荐配置// IO密集型DB查询接口QPS100单请求200ms new ThreadPoolExecutor( 20, // corePoolSize 核心线程 30, // maximumPoolSize 最大线程 60L, // 空闲线程回收时间 TimeUnit.SECONDS, new ArrayBlockingQueue(50), // 缓冲队列 new ThreadPoolExecutor.CallerRunsPolicy() );补充说明如果数据库连接池有限制例如 DB 连接池 max20 线程池最大线程不能超过 DB 连接池上限否则大量线程阻塞等待 DB 连接性能反而暴跌此时最大线程同步设为 20。区分 CPU/IO 密集型公式CPU 密集核心线程 ≈ CPU 核心数IO 密集核心线程 CPU 核心数 * (1 阻塞系数)本场景阻塞系数极高完全按 QPS 耗时计算更精准。观测调优 上线后监控线程池活跃线程数、队列堆积、任务耗时队列持续堆积加大最大线程或扩容 DB 连接最大线程频繁打满上调 maximumPoolSize 并检查 DB 慢 SQL 优化。