Skip to content

线程池参数设计计算步骤

约 867 字大约 3 分钟

并发理论

2025-11-04

核心线程数 = CPU核数 × (1 + IO等待时间 / CPU时间)

最大线程数,在核心线程数的基础上加一点点做缓冲即可。

工作队列(workQueue),只需要缓冲1~3秒的突发QPS流量即可,其余的请求应该触发线程池的拒绝策略。

响应时间500ms,200QPS并发,线程池应该怎么设置?需要几台服务器?

抓重点

响应时间500ms,确认这500ms里100ms在调度CPU进行计算,剩余400ms在处理IO(查询数据库,操作文件资源,请求第三方接口等);

平常并发200QPS,也就是1秒钟要处理200个请求;

确认服务器配置:假如是8核64G标准服务器;

一个请求完成需要耗时500ms,其中只有100ms需要用到CPU,也就是0.1s,还有0.4秒需要等待IO处理,在此等待期间,CPU就可以去给其他线程干活了。

所以一核CPU服务器在完成一个请求的线程任务时(0.5秒),可以同时完成5个请求线程任务的CPU计算工作(0.1 × 5 = 0.5),所以一核CPU的最大线程数设置为5较为合理。

因为在0.5秒内,刚好将第一轮的5个线程的CPU计算任务都执行完,第一轮第一个线程任务也刚好完成任务,进入下一轮由CPU开始执行第一个线程的CPU计算任务,完美衔接。

t代表线程,t后面第一个数字是线程名称,第二个数字是第几个任务。

image-20251026174415042

所以一核CPU的最大线程数配置为5,但是一核CPU在1秒内能处理完10个请求任务(5 ÷ 0.5 = 10)。

这里是8核的服务器,所以这里的线程池最大程数应该设置为40个(8核心 × 5线程数),QPS为80(40 ÷ 0.5)。

一般不会让CPU跑满,只会使用70%的资源。

所以,QPS为200,1秒钟需要处理200个请求任务,200 ÷ 80 ÷ 0.7 ≈ 4,需要4台8核服务器。

线程池的corePoolSize设置为40,可以让这40个线程一直处理任务。

maxPoolSize,可以设置为50,给予一定的缓冲区间(不宜过多,线程数超过40后,会存在线程上下文切换成本,耗时会更多)。

等待队列的大小设置需要综合考虑核心线程的处理能力和任务的产生速度(就是流量爆发的峰值),如果等待队列设置过大,会导致等待队列放不满,就不会去创建非核心线程。

如果突发QPS为600,则分摊到一台服务器上的压力是150,队列只需要缓冲1~3秒的突发即可,其余的请求应该触发线程池的拒绝策略。

正常处理80QPS,单机突发流量150QPS,每秒钟积压70个任务,按照缓冲3秒的突发请求来算,就是70 × 3 = 210。

所以workQueue工作队列设置为200(210取整数好维护)。


综合结果就是

需要4台8核服务器;

线程池的corePoolSize核心线程数设置为40;

maxPoolSize最大线程数设置为50;

工作队列workQueue设置为200;