java 线程池大小设置

举报
一粒沙chen 发表于 2020/10/29 19:59:04 2020/10/29
【摘要】 项目中使用线程池很正常,诸如dlcatalog创建使用metastore的client所使用的线程池,但如何设置线程池的大小则关乎系统性能。线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能耗尽资源。如果线程池过小,那么将导致许...

       项目中使用线程池很正常,诸如dlcatalog创建使用metastore的client所使用的线程池,但如何设置线程池的大小则关乎系统性能。

线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能耗尽资源。如果线程池过小,那么将导致许多空闲处理器无法执行任务,降低了系统吞吐率。

要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析:


            任务的性质:CPU密集型任务、IO密集型任务、混合型任务。 

            任务的优先级:高、中、低。 

            任务的执行时间:长、中、短。 

            任务的依赖性:是否依赖其他系统资源,如数据库连接等。


        性质不同的任务可以交给不同规模的线程池执行。

对于不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,充分利用cpu时间,应加大线程数量,如配置两倍CPU个数,而对于混合型的任务,如果可以拆分,拆分成IO密集型和CPU密集型分别处理,前提是两者运行的时间是差不多的,如果处理时间相差很大,则没必要拆分了。

        若任务对其他系统资源有依赖,如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU空闲的时间越长,那么线程数量应设置得越大,才能更好的利用CPU。

        当然具体合理线程池值大小,需要结合系统实际情况,在大量的尝试下比较才能得出,以上只是前人总结的规律。

在这篇如何合理地估算线程池大小?有一个估算合理值的公式

        最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

其中线程等待时间即为线程IO时间

        比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32。这个公式进一步转化为:

        最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目

可以得出一个结论:

线程IO时间占比例越高,线程池大小设置可以大一些。线程CPU时间所占比例越高,线程池大小设置可以更小一些。

以上公式与之前的CPU和IO密集型任务设置线程数基本吻合。


最后,我们还是需要通过压力测试来进行微调,只有经过压测测试的检验,我们才能最终保证的配置大小是准确的。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。