当前位置:首页 > 编程笔记 > 正文
已解决

大厂面试题-为什么Netty线程池默认大小为CPU核数的2倍

来自网友在路上 157857提问 提问时间:2023-11-03 10:09:14阅读次数: 57

最佳答案 问答题库578位专家为你答疑解惑

目录

1、分析原因

2、如何衡量性能指标

3、总结与使用建议


1、分析原因

我们都知道使用多线程的本质是为了提升程序的性能,总体来说有两个最核心的指标,一个延迟,一个吞吐量。延迟指的是发出请求到收到响应的时间,吞吐量指的是。这两个指标之间有一定的关联,因为同条件下延迟越短吞吐量越大,但由于它们是不同的维度,一个是时间,一个是空间,并不能相互转

因此,提升性能最主要的目的就是要降低延迟,提高吞吐量

我们如何来衡量这些性能指标呢?

2、如何衡量性能指

具体来说要降低延时,就是要提高CPU的处理能力。而提高吞吐量,就是要提高IO读写效率。那么具体如何衡量系统性能,我从以下两个方面来分析

们可以将程序分为是I/O密集型任务和CPU密集型任务。

第1种情况,对于CPU密集型任务而言,理论上“线程的数量=CPU核数”就是合适的。但是,在际应用中的线程数量一般会设置为“CPU核数+1”。因为线程有可能因为内存页失效或其他原因导致阻塞,多设置一个线程可以保证CPU的利用率。

第2种情况,而对于I/O密集型任务而言,我们假设CPU计算和I/O操作的耗时比是1:1,那么2个线程是最合适的。如CPU计算和I/O操作的耗时比是1:2,也就是说3个线程是合适的,这样CPUI/O的利用率都可以达到100%。根据这个推测,我们可以得到这样一个公式:

线程数=1+(IO耗时/CPU耗时)

不过上面个公式是针对单核CPU,如果是多核CPU只需要等比扩大就可以了,假设IO耗时和CPU比为R,那么计算公式如下:

线程数=CPU核数*(1+R)

Netty的默线程池个数,就是假设了I/O耗时和CPU耗时的占比是1:1,实际上Netty有一个参数叫ioRatio认为50,它表示在一个轮事件循环中,单个I/O线程执行I/O事件和执行异步任务的耗时占比为1:1。相当于R=1,代入上面的公式,就可以得出Netty默认设置的线程池大小自然就是

默认线程池大小=CPU核数*(1+1)

也就2倍CPU核数大。而且Netty的应用场景主要是I/O密集型任务,所以,Netty这样设计是有科性的。

看到了这里,你是不是豁然开朗了呢

3、总结与使用建

通过前面的析,我们已经知道了Netty线程池默认大小未CPU核数2倍的原因,我们在实际开发中,何来得到一个比较准确的线程池大小呢?

我们以提前压测,根据压测结果来进行微调。一般情况下,保证生产环境为压测环境的75%即可。如果修改Netty的线程池大小,也一定要考虑ioRatio这个参数是否需要调整,因为2倍CPU核数的大小假设的I/O耗时和CPU耗时为1:1,调整线程大小之后,性能效果也不一定符合期望值。

在大部分场景下,有必要太过于关注线程池大小怎么配置,I/O密集型任务使用Netty默认配置就可以。因为,提高吞吐量也不能只简单的只依赖线程池,还可以通过缓存、微服务拆分,优化业务逻辑、优化算法等方式来协作解决

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"大厂面试题-为什么Netty线程池默认大小为CPU核数的2倍":http://eshow365.cn/6-30986-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!