在高并发系统中,合理配置线程池是保证服务稳定性的关键步骤。假设当前系统 QPS ≈ 400,如何计算线程池参数?
目录
[1. 先确定几个关键指标](#1. 先确定几个关键指标)
[2. 核心线程数 = CPU 核心数 × 应用类型](#2. 核心线程数 = CPU 核心数 × 应用类型)
[CPU 密集型](#CPU 密集型)
[IO 密集型(Web 服务通常都是)](#IO 密集型(Web 服务通常都是))
[3. 最大线程数如何算?](#3. 最大线程数如何算?)
[4. 队列长度怎么定?](#4. 队列长度怎么定?)
[5. 最终推荐配置(参照400QPS)](#5. 最终推荐配置(参照400QPS))
[6. 验证方式](#6. 验证方式)
1. 先确定几个关键指标
线程池容量的配置,本质基于 任务执行时间 与 CPU 核心数:
-
QPS(每秒请求数):400
-
单个任务执行时间(T):假设 100ms
-
单个任务IO等待时间(W):假设 80ms
-
单个任务CPU计算时间(C):假设 20ms
-
CPU 核心数(N):假设 8 核
2. 核心线程数 = CPU 核心数 × 应用类型
CPU 密集型
corePoolSize = N + 1
IO 密集型(Web 服务通常都是)
corePoolSize = N × (1 + W / C)
注意: 很多文章给出经验值corePoolSize = N × 2,但这只适合 W≈C 的情况
3. 最大线程数如何算?
最大线程数目标:确保吞吐不会掉
maxPoolSize = QPS × T
注意:T 要转秒,例如 100ms = 0.1s
计算:
maxPoolSize = 400 × 0.1 = 40
⚠ 但 40 太少,还要兼容瞬时抖动,所以通常设为:
maxPoolSize ≈ corePoolSize × 2(IO 密集型)
也就是:
maxPoolSize ≈ 80
4. 队列长度怎么定?
队列作用:承载瞬时突发流量
常见公式:
queueSize = qps × max_processing_time
其中max_processing_time是 系统允许的最大排队 + 执行时间,一般采用任务的平均处理时间做哦参考
示例:
queueSize = 400 × 0.1 ≈ 40
如果你希望能承载 1~2 秒的业务峰值突刺,同时业务能够容忍 1~2 秒的等待时间,可调整为:
queueSize = qps × 1~2 秒 → 400~800
5. 最终推荐配置(参照400QPS)
| 参数 | 值(示例) |
|---|---|
| corePoolSize | 40 |
| maxPoolSize | 80 |
| queueSize | 400~800(视突刺程度) |
| keepAliveTime | 常规10~60秒,持续高并发业务视持续时间调整 |
6. 验证方式
上线前一定要压测:
-
收敛区间(CPU、RT、拒绝次数)
-
峰值区间(队列长度是否打满)
-
线程增长是否及时