赞
踩
java中线程池用过吧(听到这里内心窃喜,以为又要老生常谈让我说下主要参数),结果面试官画风一转,说下线程数通常是怎么设置的?有什么规则?(嗯哼,面试还没开始就触碰到了我的知识盲点吗?无数乌鸦飘过)
硬着头皮回答,经验值一般是cpu核数*2
面试官灵魂拷问为什么是cpu 数*2呢?
。。。老实交代,不知道。。
CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
CPU bound的程序一般而言CPU占用率相当高。这可能是因为任务本身不太需要访问I/O设备,也可能是因为程序是多线程实现因此屏蔽掉了等待I/O的时间。
IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。
I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低。这可能是因为任务本身需要大量I/O操作,而pipeline做得不是很好,没有充分利用处理器能力
CPU密集型任务特点是要进行大量的计算,这种场景下,任务越多花在任务切换的时间就越多,CPU执行任务的效率就越低。
IO密集型任务,特点是CPU消耗很少,任务大部分时间在等待IO操作完成(比如网络访问第三方系统、查询库等)。对于IO密集型任务,任务越多CPU效率越高,当然都有一个限度。
一个系统请求数=请求的到达率*平均某个单独请求花费的时间
通过这个公式我们可以了解到三个具体参数值:
最佳线程数目 =((线程等待时间+线程CPU时间)/线程CPU时间)* CPU数目
通过这个公式可以得出一个结论:
线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。
这个结论与前文提到的经验值基本吻合。
文中提到了线程数设置经验值以及理论支撑,在实际应用中,还需要结合实际消耗,压测,来对线程数进行微调。
更多精彩内容请关注公众号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。