为什么Netty线程池默认大小为CPU核数的2倍
有位工作5年的小伙伴问我说,为什么Netty线程池默认大小为CPU核数的2倍,今天,我花2分钟时间给大家专门分享一下我对这个问题的理解。
另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以在我的煮叶简介中找到。
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个线程是合适的,这样CPU和I/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默认配置就可以了。因为,提高吞吐量也不能只简单的只依赖线程池,还可以通过缓存、微服务拆分,优化业务逻辑、优化算法等方式来协作解决。
相关文章
- 线程间的协作(wait/notify/sleep/yield/join)
- Java线程池基本解读
- Nginx分配CPU进程参数worker_cpu_affinity说明
- Swoole 学习:协程、线程、IO多路复用、PHP多进程。
- Hystrix线程池的使用
- [javaSE] 练习队列线程和对象序列化详解编程语言
- 量深入探索——查看Linux系统的CPU数量(linux查看cpu数)
- 资源MySQL过高CPU占用的解决方案(mysql占用cpu)
- 使用情况Linux下监控CPU使用情况的简单方法(linux监控cpu)
- Linux中CPU监控的指令汇总(linux监控cpu命令)
- CPU调优:使用Linux玩转服务器(cpu使用linux)
- 使用率利用Linux系统查看CPU使用率的方法(linux统计cpu)
- 操作系统查看LINUX操作系统中CPU个数(cpu个数linux)
- 深入浅出:理解Linux线程结构(Linux线程结构)
- 使用情况利用Linux追踪CPU使用状况(linux记录cpu)
- Linux下线程处理异常情况(linux线程异常)
- Linux下销毁线程的方法(线程销毁linux)
- 数Linux查看CPU线程数:简单操作指南(linux查看cpu线程)
- 如何在Linux中查看CPU核数(linux看cpu核数)
- Redis实现高效率线程池(redis线程池)
- MySQL线程安全:实现多线程并发操作的保障。(mysql 线程安全)
- 「Linux占用CPU独占大牌,如何找出罪魁祸首?」(linux独占cpu)
- Linux系统为什么会消耗过多CPU资源?(linux 消耗cpu)
- 深入Linux:如何查询CPU的使用率?(linux查询cpu使用率)
- Linux下检查CPU温度的小窍门(linux查看cpu温度)
- 的限制Oracle中CPU个数的受限定义(oracle中cpu个数)
- 使用提升服务性能使用Redis限制CPU使用(redis限制cpu)
- 使用Oracle CPU,提高运算效率吧(oracle cpu用户)
- Oracle CPU优化之路提升性能的不二法则(oracle cpu优化)
- java多线程编程之向线程传递数据的三种方法