1. 核心线程数配置(corePoolSize)
1.1 核心线程数的配置影响因素
- CPU核心数
- CPU密集型任务:核心线程数 ≈ CPU核心数 + 1
- IO密集型任务:核心线程数 ≈ CPU核心数 × (1 + 平均等待时间/平均计算时间) 一般经验值:2 × CPU核心数
- 内存大小:1个线程大约需要占用1M的栈内存空间,避免内存溢出。
- 系统整体资源协调:一个应用可能会有多个线程池,需要综合考量整个系统的所有线程数。所有线程池的核心线程数总和应小于CPU核心数的2-3倍
- 依赖关系线程池:需考虑上下游系统的线程情况,避免下游成为瓶颈导致上游堆积。比如下游数据库连接资源不够,上游线程再多也会在阻塞状态。
- 业务需求:根据业务的重要性和吞吐量等综合分配系统资源,避免单个线程池占用整个系统资源过多,影响其他业务。
使用
Runtime.getRuntime().availableProcessors()
可以获取k8s限制后的CPU数
1.2 CPU利用率与线程设置的深度关系
1.2.1 CPU密集型任务
线程数 | CPU利用率 | 吞吐量 | 上下文切换 |
---|---|---|---|
=核心数 | ~95% | 最佳 | 最低 |
>核心数 | 100% | 下降 | 急剧增加 |
<核心数 | <100% | 未饱和 | 低 |
当上下文切换次数超过核心数×10000/秒时性能下降
1.2.2 I/O密集型任务
线程数 | CPU利用率 | 吞吐量 | 资源竞争 |
---|---|---|---|
不足 | <70% | 未饱和 | 低 |
适量 | 70-90% | 最佳 | 可控 |
过多 | 100% | 下降 | 严重 |
1.2.3 生产环境建议配置参考
场景 | CPU目标利用率 | 线程数公式 | 示例(8核) |
---|---|---|---|
纯计算任务 | 95-100% | 核心数 ±1 | 7-9 |
普通Web服务 | 70-85% | 核心数 × (1 + 平均I/O比例) | 16-24 |
高延迟外部调用 | 60-75% | 核心数 × (2 + 平均I/O比例) | 32-40 |
批处理任务 | 85-95% | 核心数 × 1.5 | 12 |
2. 最大线程数 (maximumPoolSize)
- 通常为核心线程数的1.5-2倍
- 对于突发流量大的场景可设置更高
- 需考虑系统资源限制(内存、文件句柄等)
当最大线程数超过CPU核心线程数后直接表现就是提高CPU的负载,然后就是线程对内存的占用。
3. 队列容量 (workQueue capacity)
- 根据任务特性和系统容忍度决定
- 计算公式:
队列容量 = 期望最大请求数 - (最大线程数 × 单任务平均处理时间)
- 一般经验值:核心线程数的2-3倍
4. 空闲线程存活时间 (keepAliveTime)
-
通常设置为60秒左右
-
突发流量频繁的系统可适当延长
-
资源紧张的系统可缩短时间
没有放之四海皆准的完美配置,最佳参数需要通过监控和调优不断调整。