[转帖]为什么说IO密集型业务,线程数是CPU数的2倍?

为什么,io,密集型,业务,线程,cpu · 浏览次数 : 0

小编点评

标题的表述并不正确,因为作者描述了I/O密集型业务的线程数量设置的理论错误。 I/O密集型业务的线程数量设置应该与I/O请求的速度有关。大多数情况下,I/O请求的速度远低于CPU运行的速度,所以线程数设置成CPU 的 2 倍或更少是合理的。 例如,对于一个Tomcat来说,其核心线程数可能不到100,即使支持的I/O请求数千甚至上万。

正文

https://juejin.cn/post/7184619435309662266

 

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,非公众号转载保留此声明。

I/O密集型业务,线程数量要设置成 CPU 的 2 倍!

也不知道这是哪本书的坑爹理论,现在总有一些小青年老拿着这样的定理来说教。说的信誓旦旦,毋庸置疑,仿佛是权威的化身。讨论时把这样的理论当作前提,​真的是受害不浅。

但可惜的是,这样的理论站不住脚。我只需要一个简单的反问,它就不攻自破:

Tomcat的默认线程数是多少呢?

2372.gif

它既不是 CPU 的 2 倍,也不是什么其他数值。在某些高并发的服务中,它的核心线程数,可能达到数千甚至上万。对于一个Tomcat来说,它处理的大多数都是I/O密集型的业务,可以说是最好的实践场景。

要明白这个线程数设置的玄机,就必须了解I/O请求的特点。I/O请求不仅仅指的是磁盘读写,在互联网服务中更多指的是网络I/O请求。

I/O请求的速度,要远低于CPU运行的速度。大部分I/O请求,在发起之后,就进入等待状态,这个等待状态不会浪费CPU,所以一台机器在同一时刻支持的I/O请求,可以很多。

如果I/O请求的速度比较快,和CPU的耗时对等的时候,我们把处理I/O的线程数,设置成 CPU 的 2倍,是合理的。但现实中并没有这么多如果,我们要处理秒成千上万的I/O请求,注定了它的耗时要比CPU多的多。

像RPC组件,比如Dubbo服务端,也会设置一个比较大的线程数(比如600);Feign这种就更不用多说了,短连接意味着更多线程数的支持。这都是些最佳实践。

虽然I/O线程数量增多,会造成非常频繁的上下文切换,进而影响效率。但在互联网应用中,它却是一个优秀的解决方案。

更优秀的解决方式也有,那就是使用协程。协程是用户态的线程,是对普通线程更细粒度的划分。它是在用户态运行的,由用户自行调度,所以也就避免了频繁的上下文切换问题。

但协程在Java中还不成熟,它依然是Golang语言的诱人特性。使用Golang开发的Web服务,可以采用更少的线程来支持大量I/O密集型的请求。

综上所述,标题的表述并不正确,而且错的离谱。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,​进一步交流。​

与[转帖]为什么说IO密集型业务,线程数是CPU数的2倍?相似的内容:

[转帖]为什么说IO密集型业务,线程数是CPU数的2倍?

https://juejin.cn/post/7184619435309662266 原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,非公众号转载保留此声明。 I/O密集型业务,线程数量要设置成 CPU 的 2 倍! 也不知道这是哪本书的坑爹理论,现在总有一些小青年老拿着这样的定理来说教

[转帖]高性能IO模型:为什么单线程Redis能那么快?

https://zhuanlan.zhihu.com/p/596170085 你好,我是蒋德钧。 今天,我们来探讨一个很多人都很关心的问题:“为什么单线程的Redis能那么快?” 首先,我要和你厘清一个事实,我们通常说,Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的

[转帖]为什么网络 I/O 会被阻塞?

https://my.oschina.net/lenve/blog/5952439 我们应该都知道 socket(套接字),你可以认为我们的通信都要基于这个玩意,而常说的网络通信又分为 TCP 与 UDP 两种,下面我会以 TCP 通信为例来阐述下 socket 的通信流程。 不过在此之前,我先来说

[转帖]小技巧!如何用 systemtap 排查问题

https://www.modb.pro/db/79444 霸爷博客,干货满满。有两篇文章现在还记得,《Linux下如何知道文件被哪个进程写》[1]和《巧用Systemtap注入延迟模拟IO设备抖动》[2],周末突然想起来,发现能看懂了:) 本文虽然说是小技巧,可是难度一点也不低 ^_^ 什么是 s

[转帖]实战瓶颈定位-我的MySQL为什么压不上去

https://plantegg.github.io/2023/06/20/%E5%AE%9E%E6%88%98%E7%93%B6%E9%A2%88%E5%AE%9A%E4%BD%8D-%E6%88%91%E7%9A%84MySQL%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8E%

[转帖]实战瓶颈定位-我的MySQL为什么压不上去–写场景

https://plantegg.github.io/2023/06/30/%E5%AE%9E%E6%88%98%E7%93%B6%E9%A2%88%E5%AE%9A%E4%BD%8D-%E6%88%91%E7%9A%84MySQL%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8E%

【转帖】《MySQL高级篇》四、索引的存储结构

1. 为什么使用索引 假如给数据使用 二叉树 这样的数据结构进行存储,如下图所示 2、索引及其优缺点 2.1 索引概述 2.2 优点 类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的 IO 成本 这也是创建索引的主要的原因。通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性 (唯一

[转帖]Redis系列(十六)、Redis6新特性之IO多线程

https://blog.csdn.net/wsdc0521/article/details/106766587 终于,Redis的多线程版本横空出世,大大提高了并发,本篇就带大家来看看什么是IO多线程,和我们理解的多线程有什么区别,与Memcached的多线程又有什么区别。 目录 介绍 为什么Re

[转帖]为什么说MySQL单表行数不要超过2000w?

https://segmentfault.com/a/1190000042716913 大家好,我是不才陈某~ 作为在后端圈开车的多年老司机,是不是经常听到过,“mysql 单表最好不要超过 2000w”,“单表超过 2000w 就要考虑数据迁移了”,“你这个表数据都马上要到 2000w 了,难怪查

[转帖]为什么说JVM是黑盒子般存在,从Java 虚拟机原理内存开始

https://maimai.cn/article/detail?fid=1739907745&efid=ALbQzkwOvQr-0GryeUzRsw 为什么要学习 JVM 在很多 Java 程序员的开发生涯里,JVM 一直是黑盒子一般的存在,大家只知道运行 Java 程序需要依靠 JVM,千篇一律