设计线程数原则
占用一定数量的cpu执行一定的线程数
线程数过大会导致线程频繁切换
线程数过小会浪费cpu
概念描述
- cpu执行时间:cpu计算的时间
- cpu等待事件:IO时间,cpu等待
- 总时间: 以上两者加和
公式
cpu执行时间/总时间 = cpu数量/总线程数
两种线程池模型
CPU密集型
- 应用场景:适用于大量数据的计算,减少对磁盘,网络访问的情况下使用(业务场景中性能瓶颈为cpu而非内存,磁盘IO或带宽)
- 线程数设计:当前机器CPU总数+1
I/O密集型
- 应用场景:适用于大量数据的交互,性能瓶颈在IO而非cpu上.
- 线程数设计:当前机器CPU总数*2
最优线程数计算
在《Java并发编程实践》中,是这样来计算线程池的线程数目的:
一个基准负载下,使用 几种不同大小的线程池运行你的应用程序,并观察CPU利用率的水平。
给定下列定义:
概念:
- Ncpu = 节点cpu数量
- Ucp = 目标cpu使用率
- W/C =等待IO时间与计算时间的比率
公式
为保持处理器达到期望的使用率,最优的池的大小等于:
Nthreads = NcpuUcpu(1&#