概念,IO密集型和CPU密集型
CPU密集型(计算密集型):
cpu密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力 计算机密集型任务主要消耗CPU资源,因此,代码运行效率至关重要,Python这样的脚本代码运行效率很低,完全不适合计算机密集型任务。对于计算密集型任务,最好用C语言编写。
IO密集型
IO密集型涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但是也有一个限度。常见的大部分任务都是IO密集型任务,比如web应用。
大家对线程数量的设置有一个经验的计算公式
如果是CPU密集型应用,则线程池大小设置为N+1(N:CPU的个数)
如果是IO密集型应用,则线程池大小设置为2N+1
如果一台服务器上只部署这一个应用并且只有这一个线程池,那么这种估算或许是合理的。但是在IO优化中,下面的估算公式是可能更合适:
最佳线程数量=((线程等待时间+线程CPU时间)/线程CPU时间)*CPU数目
显然,线程等待时间所占比例越高,需要的线程数量 就越多,反之则越少。
举个例子,一台8核的服务器,平均每个CPU运行时间为1S,线程等待时间(非CPU运行时间)为2S,那么公式就是((1+2)/1)*8 = 24 。公式可以进一步转化为:
最佳线程数量=(线程的等待时间与线程的计算(CPU)时间之比+1)*CPU数目
最后总结:
其实要想获得最准确的线程数量,我们还需要通过压力测试来进行微调,只有经过压力测试过的才是最适用于自己的项目的。