线程池的参数应该怎样设置呢?相信对于很多的人来说这也是一个比较难的问题,下面就让我们一起来解决一下,究竟应该如何设置线程池的参数才是最合理的吧!
首先在设置参数的时候,有以下的几点是我们需要考虑到的!
1、下游系统抗并发的能力
多线程给下游系统造成的并发等于你设置的线程数
例:
假如,是多线程访问数据库,那么就得考虑数据库的连接池大小设置,数据库并发太多影响其qps,会将数据库打挂等问题。
假如,是访问下游系统的接口,那么就得考虑下游系统是否可以抗得住这么多的并发量,不可以将下游系统打挂了。
2、CPU使用率
在线程数设置的比较大的时候,那么就会出现以下的几个问题:
(1)线程的初始化,切换,销毁等操作会消耗比较多的cpu资源,从而使得cpu利用率一直维持在比较高的水平。
(2)线程数比较大的时候,任务会短时间迅速执行,任务的集中执行会给cpu造成比较大的压力。
(3)任务的集中支持,会使得cpu的使用率呈现锯齿状,也就是说在短时间内cpu升高,之后,迅速下降到闲置状态。
cpu使用的不合理,应该减小线程数,让任务在队列等待,使得cpu的使用率应该持续稳定在一个合理,平均的数值范围。
所以,在cpu在够用的时候,不应该过大,注意,并不是越大越好。
这个时候,可以通过上线之后,观察机器的cpu使用率和cpu负载,观察这两个参数来判断线程数是否合理。
能够通过命令查看cpu使用率是不是主要花在线程切换上。
cpu负载是正在执行的线程和等待执行的线程之和。
注意了,这里的等待指的是线程处在running状态,可是,还没有被cpu调度的等待,负载较高,也就意味着cpu竞争激烈,进而的说明,线程设置的比较大,在抢cpu资源。
负载的值通常约等于cpu核数是比较合理的数值。
3、线程池中执行的任务性质
计算密集型的任务比较占cpu,所以说,通常线程数设置的大小等于或者是略微大于cpu的核数。
可是,IO型任务主要时间消耗在IO等待上,cpu压力不是很大,所以,线程数一般设置的比较的大。
例:
多线程访问数据库,数据库有128个表,这样的话,就直接考虑使用128个线程。
4、内存使用率
线程数过多以及队列的大小对于这个数据都会造成影响。
队列的大小应该通过前期计算线程池任务的条数,来合理的设置队列的大小,不适合太小,让它不会溢出,因为,溢出会走拒绝策略,多多少少对于它的性能会造成一定的影响,与此同时,复杂度也会被增加,所以,这里需要我们好好的考量拒绝策略的选择。
拒绝策略包括了AbortPolicy(抛异常), CallerRunsPolicy(主线程执行) 和
DiscardPolicy(丢弃),也不适合过大,过大的话也用不上,还会消耗比较大的内存。
以上的四点是我们一定要去考虑的,之后给大家介绍一个很多人都会容易犯的错误。
如下:
线程池的配置
这里的话,发现任务执行的比较慢,机器的cpu,内存等也比较的低,所以,做出了加大线程的决定。
大约还需要100个线程,所以修改配置:
问题:
线程池是不是要创建新的线程,要做以下考虑:
1、假如,线程数小于corePoolSize,那么就直接添加新的线程。
2、假如,线程数大于等于corePoolSize,那么就放进队列进行等待,假如,放进队列成功了,那么就不添加新的线程。
3、假如对列满了,线程数小于maxPoolSize,那么就会新建线程,假如,大于maxpoolSize,那么就会走到拒绝策略。
所以,队列设置较大,一般来说是不会满,所以线程数其实是一直达不到maxPoolSize的,所以,其实一致用的是50个线程。
解决:
将核心线程和最大线程设置成一个值,都为100就可以了。
以上就是对于线程池参数设置的一个简单介绍了,你都了解了吗?更多内容,请继续关注奇Q工具网的常见问题栏目了解吧。