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

2023-11-03 05:52

本文主要是介绍大厂面试题-为什么Netty线程池默认大小为CPU核数的2倍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

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默认配置就可以。因为,提高吞吐量也不能只简单的只依赖线程池,还可以通过缓存、微服务拆分,优化业务逻辑、优化算法等方式来协作解决

这篇关于大厂面试题-为什么Netty线程池默认大小为CPU核数的2倍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/336041

相关文章

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1