✅线程数设定成多少更合适?

一、问题解析

线程数设定是个高频出现的题目,这个题目对于优秀的面试官希望得到的答案是面试者的思考过程,考察其分析线程数设定的思考方向是否全面(主要包括对操作系统线程的理解和实际设置经验)。比较差的面试官才会认为固定的公式是正确的。

首先看一下影响线程数的因素可能有哪些?

影响线程数的因素
线程数的设定需要根据应用程序的需求和运行环境来决定,没有一个固定的最佳值。以下是一些影响线程数设定的关键因素:
CPU 核数
●多核处理器:理想的线程数肯定取决于处理器的核心数。在理想情况下,每个核心运行一个线程是最高效的。
●超线程技术(如Intel的Hyper-Threading):目前,很多CPU都采用了超线程技术,也就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算。所以我们经常可以看到"4核8线程的CPU",也就是物理内核有4个,逻辑内核有8个。如果CPU支持超线程技术,可以为每个核心分配更多的线程,因为超线程可以提高CPU资源的利用率。

应用类型
●CPU密集型:对于CPU密集型的任务(如计算密集型任务),线程数最好设置为核心数的1到1.5倍,因为这些任务主要消耗CPU资源。
●I/O密集型:如果任务涉及大量的等待或阻塞(如数据库操作、文件操作、网络操作等),则可以配置更多的线程,比如2倍,因为线程在等待时CPU可以切换去处理其他任务。

JVM和系统资源
●内存限制:每个线程都会占用一定的内存(如栈空间)。如果创建过多线程,可能会消耗大量内存,甚至导致内存溢出。
●操作系统限制:操作系统对进程可创建的线程数通常有限制,过多的线程可能导致系统性能下降。

其他考虑
●RT要求:如果系统对响应时间有严格要求,可能需要更多线程来减少处理延迟。
●任务特性:不同的任务可能对线程数的需求不同。长时间运行的任务与短时任务,同步任务与异步任务,都需要考虑不同的线程配置。

有没有公式

根据我们前面提到的这些影响因素来看,主要和CPU核心数、以及应用类型等有关。简单一点的话,可以根据应用类型来套用以下公式(但是,实际应用起来,也不要死守着公式不放,公式只是可以当作参考):

●如果是CPU密集型应用,则线程池大小设置为N+1
●如果是IO密集型应用,则线程池大小设置为2N+1

上面的N为CPU总核数

但是,上面的公式中,前提要求是知道你的应用是IO密集型还是CPU密集型,那么,到底怎么样算IO密集,怎么样又算CPU密集呢?一个应用就真的能明确的定位出来是CPU密集还是IO密集吗?

所以,还有另外一个公式:

 

线程数=CPU核心数×目标CPU利用率×1(1+等待时间/计算时间)​



等待时间是指线程在执行过程中花费在等待外部操作完成的时间。这些外部操作通常包括I/O操作(如读写文件、数据库操作、网络请求等)和其他资源的同步等待(如等待锁的释放)。在等待时间内,线程通常不占用CPU资源,因为它在等待某个事件或资源可用。
计算时间是指线程实际进行计算处理的时间,即线程在CPU上执行操作的时间。计算时间通常指的是CPU密集型操作,如数学计算、数据处理等。

在这个公式中,"等待时间 / 计算时间"的比例是一个关键因素,它帮助决定合适的线程数量以平衡CPU利用和等待效率:

●I/O密集型任务:对于I/O密集型任务,等待时间通常远大于计算时间,这意味着可以分配更多的线程。当一个线程在等待时(如等待网络响应),CPU可以切换到另一个线程进行计算,从而提高CPU利用率。
●CPU密集型任务:对于CPU密集型任务,计算时间通常占主导地位。在这种情况下,增加线程数可能不会提高性能,因为大部分时间都在进行CPU计算,线程之间的上下文切换可能导致性能下降。

不建议直接套公式

上面给出了公式,但是这个公式建议大家可以参考,而不是直接套用。

一方面我们讲过了,线程数设置时还需要考虑JVM、机器资源等,还需要考虑超线程等技术,另外有时候我们看到的CPU核数也不一定就是真实的。

很多时候,我们的应用部署在云服务器上面,有时候给我们分配的机器显示的是8核的,但是你要知道你实际上使用的只是虚拟机而已,并不是物理机,实际上大多数情况下不能发挥出8核的作用来。

可以在刚上线的时候,先根据公式大致的设置一个数值,然后再根据你自己的实际业务情况,以及不断的压测结果,再不断调整,最终达到一个相对合理的值。

在说明压测的时候,要说清楚可接受的响应耗时是多少,大于这个阈值即是错误,错误率多少可接受。这样给出的线程池参数才合理。

二、粉丝福利

我是浮生,一个工作十四年经验的Java程序员!

最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份80W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我
公众号:“ 
灰灰聊架构 ”, 回复暗号:“ 321 ”即可获取

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值