JUC_如何较为合适地确定线程池需要创建的线程数量

为什么使用多线程?

最大化CPU使用率

如何最大化CPU密集型任务CPU使用率?

什么是CPU密集型任务?

计算占大部分,数据传输(IO)占小部分

如何最大化利用率?

核心是减少线程之间上下文切换带来的开销

如何确定合适的线程数?

线程数=CPU核数(逻辑)+1

+1”是为了确保在意外情况出现中断时,仍然有一个线程任务使得CPU不空闲下来。

如何最大化IO密集型任务CPU使用率?

什么是IO密集型任务?

计算占小部分,数据传输(IO)占大部分

如何最大化利用率?

核心是在IO的过程中,减少CPU的空闲状态时间,增加线程执行任务填充CPU空闲时间

如何确定合适的线程数?

线程数=CPU核数×(1/CPU利用率)=CPU核数×[1+(IO耗时/CPU耗时)]
  • +1”同样是备用。
  • IO耗时/CPU耗时)耗时即为在IO期间,看看需要多少线程可以填充CPU的空闲期。
  • 具体的耗时,需要根据实际业务测试得出。

实际运用

  • Q1: 每个Transaction由3个线程完成,每个Transaction处理时间为0.5s,如何设计线程数保证系统TPS为100?
  • A1:
每个线程每秒可以处理的Transaction数:
1/3/0.5=2/3;
TPS=100需要的线程数:
100/(2/3)=150

一般服务器的CPU核数为16~32,线程数量过于多带来的上下文切换开销也要实际考虑。

  • Q2:某个任务,CPU计算需要10ms,数据传输需要100ms,对于16h核数的服务器,如何设置线程数?
  • A2:

数据传输时间远大于CPU计算时间,所以是IO密集型任务。

线程数=16×[1+(100/10)]=176
  • Q3:在上一问的基础上,如果数据库QPS为1000,线程数该作何修改?
  • A3:
不考虑数据库QPS时,系统的QPS为:
QPS=线程数*[1000/(IO耗时+CPU耗时)]=176×[1000/(100+10)]=1600

根据数据库QPS按比例减少线程数:
线程数=176×1000/1600=110

参考

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值