线程池该怎么设置

145 阅读1分钟

CPU型任务

从经验角度来讲,对于CPU型的任务线程数等于机器核数加一 那为什么是机器核数+1,不是机器核数+2?或者+3呢

IO型任务

从经验角度来讲,对于io型任务,线程数应该设置为两倍的CPU核数

那为什么是机器核数的2倍,不是机器核数3倍?

既包含CPU任务又包含IO任务

该怎么设置?

  • 问题一:假设在一个请求QPS中计算(cpu任务)需要5ms,DB操作(IO型任务)需要100ms,对于一台有8核的机器来说,如果要求cpu利用率达到100%,怎么设置线程数呢?

答: 1、计算5ms,DB操作100ms,单个核cpu录用率就是5/(5+100)

2、如果想到到达理论上的100%的CPU利用率就是21个线程(1/(5/(5+100)))其中0.04761=5/(5+100)

3、那现在有8个核理论上就是应该有8*21=168 个线程

  • 问题二:如果这个DB操作最大的QPS是1000,那线程数又改设置成多少呢?

答:只要按照比例减少就可以

1、如果设置成168个线程,那么对DB访问的QPS就是168*(1000/(5+100))=1600

2、现在因为DB的最大QPS只能是1000,所以线程池的大小就是105个线程 168*(1000/1600)=105