合理的设置线程数能有效提高 CPU 的利用率,设置线程数又得区分任务是CPU密集型
还是 IO密集型
。
解释
CPU密集型
就是需要大量进行计算任务的线程,如:计算1+2+3+...、计算圆周率、视频解码等,这种任务本身不太需要访问I/O设备,CPU的使用率高;IO密集型
就是任务运行时大部分的时间都是CPU在等I/O (硬盘/内存) 的读/写操作,如:查询数据库、文件传输、网络请求等,CPU的使用率不高。
根据经验
1、CPU密集型:线程数少一点,推荐:CPU内核数 + 1
2、IO密集型:线程数多一些,推荐:CPU内核数 * 2
3、混合型:可以将CPU密集和IO密集的操作分成两个线程池去执行即可!
PS:这种方式可能会被面试官找茬
根据计算公式
根据《Java并发编程实战》书中的计算线程数的公式
Ncpu = CPU的数量
Ucpu = 目标CPU的使用率, 0 <= Ucpu <= 1
W/C = 等待时间与计算时间的比率
为保持处理器达到期望的使用率,最优的池的大小等于:
Nthreads = Ncpu x Ucpu x (1 + W/C)
实战
假如在一个请求中,计算操作需要10ms,DB操作需要100ms,对于一台2个CPU的服务器,设置多少合适
假设我们需要CPU的使用率达到100%,那么套入公式:`2 x 1 x (1 + 100/10) = 22`
但是实际开发中,可能有各种因素的影响,因此就需要我们在这个结果的基础上进行压力测试,最终得到一个完美的线程数量
最后补个网图,解释了CPU密集型、IO密集型
本文共 399 个字数,平均阅读时长 ≈ 1分钟
很好奇,如果按文章说的,2核,cpu100%
计算时间10ms,等待时间100ms,
需要线程:2 x 1 x (1 + 100/10) = 22
计算时间5ms,等待时间 500ms
需要线程:2 x 1 x (1 + 500/5) = 200
计算时间1ms,等待时间 1000ms
需要线程:2 x 1 x (1 + 1000/1) = 2000
这样真的合理吗?
期待博主回复