合理设置线程数

1、Amdahl(阿姆达尔)定律

概念:描述了线程数与多线程程序相对于单线程程序的提速之间的关系。

公式

P:程序中必须串行(即无法并发优化)的部分耗时占程序总耗时的比率。

N:为线程数。

Smax即理论上最大提速。

公式推导思路:设程序单线程版耗时为T(1),多线程版耗时为T(N),P为单线程的耗时比例。则Smax结果为以下:

设T(1)为1,则串行耗时为P,可并行部分耗时1-P,通过N个线程并发则,并行部分耗时为(1-P)/N。则T(N)=P+(1-P)/N,则带入图2公式,则图2即变成图1的公式。

无穷极限推导公式的作用:当线程数N越大,程序中串行耗时占用的比例越大。

结论:提升程序性能仅仅增加并发线程数是不够的,还需要优化算法或业务上必须串行的耗时代码。

2、线程数设置原则:避免随意设置

线程数设置过少无法充分利用处理器资源,太多又会导致过多的线程切换。

设置线程数首要考虑处理器数目,但因为一个系统处理器资源会存在许多进程共享,基本没法考虑到所有进程线程内部情况,即使只有1个进程,如一个javaweb应用,但其存在许多模块,仅从一个模块来考虑线程数的合理值并不可靠,所以合理的设置线程数仅仅只是避免随意设置。

java提供了获取系统的处理器数代码:

int nCPU=Runtime.getRuntime().availableProcessors();

3、非商用软件线程数合理设置参考:

CPU密集型:N+1,避免缺页中断导致处理器资源浪费,可设置一个额外的线程;

IO密集型:1->2N,从小往大设置,因为 IO操作会导致上下文切换,设置过多的线程会导致额外开销,但IO密集型线程在等待IO操作返回结果时是不占用处理器资源的,因此可以给每个处理器额外的安排1个线程。

4、商用软件线程数合理设置:

N(cpu):CPU核心数;

U(cpu):CPU的使用率;

WT(wait time):程序花费在等待(例如等待IO操作结果)上的时长;

ST(server time):程序实际占用处理器计算的时长;

通过jvisualvm提供的监视数据可计算出WT/ST的值;

注意:还需考虑其他共享资源的稀缺情况对线程实际处理能力的限制,如数据库连接、文件句柄数、网络连接等。

5、系统的最大创建线程数量预估(不考虑特殊情况)

预估线程最大数量=(机器本身可用内存-机器上所有运行程序JVM分配的堆内存之和)/Xss的值

Xss等价于-XX:ThreadStackSize。
设置单个线程的大小,默认为512k ~ 1024k

参考:《java多线程编程实战指南-核心篇》P172

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值