占用一定数量的cpu执行一定的线程数
线程数过大会导致线程频繁切换
线程数过小会浪费cpu
- cpu执行时间:cpu计算的时间
- cpu等待事件:IO时间,cpu等待
- 总时间: 以上两者加和
cpu执行时间/总时间 = cpu数量/总线程数
两种线程池模型 CPU密集型- 应用场景:适用于大量数据的计算,减少对磁盘,网络访问的情况下使用(业务场景中性能瓶颈为cpu而非内存,磁盘IO或带宽)
- 线程数设计:当前机器CPU总数+1
- 应用场景:适用于大量数据的交互,性能瓶颈在IO而非cpu上.
- 线程数设计:当前机器CPU总数*2
在《Java并发编程实践》中,是这样来计算线程池的线程数目的:
一个基准负载下,使用 几种不同大小的线程池运行你的应用程序,并观察CPU利用率的水平。
给定下列定义:
- Ncpu = 节点cpu数量
- Ucp = 目标cpu使用率
- W/C =等待IO时间与计算时间的比率
为保持处理器达到期望的使用率,最优的池的大小等于:
Nthreads = NcpuUcpu(1+W/C)
对于计算密集型应用,假定等待时间趋近于0,是的CPU利用率达到100%,那么线程数就是CPU核心数,那这个+1意义何在呢?
《Java并发编程实践》这么说:
计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。
对于IO密集型应用,假定所有的 *** 作时间几乎都是IO *** 作耗时,那么 W/C的值就为1,Ucpu 要达到100%利用率。
根据 Nthreads = Ncpu x Ucpu x (1 + W/C),
那么对应的线程数确实为 2Ncpu 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)