从业时间越久,发现互联网很多知识都是错的, 对小白误导有多深?

2022-04-18 22:04:26 +08:00
 jeesk
说说我自己的看法, 无论是 csdn 还是知乎, 在我最开始从业 java 的时候,觉得他们说得没有毛病? 从业几年后,发现很多都是在鬼扯。 就拿 BIO 和 NIO 谁性能好, 知乎上面竞争激烈,下面我粘贴一个知乎的回答。

回答 1:

首先要明确一点:nio 的适用于 io 高并发场景线程开销包括:内存开销(创建一个线程需要为其分配和维护一个 tcb 线程控制块保存上下文,一个线程私有的栈)、线程上下文切换的时间开销(保存上下文,加载下一个线程的上下文),在高并发环境下多出来的这一点点开销积累起来是非常可观的。若使用 bio ,高并发必然引起激烈 contention ,导致大量的上下文切换,若采用一个 io 一个线程模型,一个线程 M 级的空间消耗,内存消耗不起。而 netty 采用 nio 加 selector 加线程池基本上解决了上述问题:一是线程池限制了内存消耗,二是采用 selector 使得只有处于活动状态的 io 才会去占用线程,不会使线程白白因为 io 而阻塞,提高了线程利用率。

说说他们的谬论:
1. 使用 BIO 上下文切换厉害, 如果是相同 4 核 cpu , 无论我是用 bio 还是 nio ,都用 200 个线程, 这个时候对 cpu 的竞争到底有多剧烈? 我个人觉得差不了多少。 所以这个说法是错的。

2. 若采用一个 io 一个线程模型,一个线程 M 级的空间消耗。 这个就更扯淡了。 即使是 tomcat 在 8.5 以前也是 BIO 200 个线程, 都没有用到 1w 个线程? 为什么非要扯开大量线程呢? 并且 tomcat 在 8.5 以后才默认 nio.

3. 一是线程池限制了内存消耗,二是采用 selector 使得只有处于活动状态的 io 才会去占用线程. 那我 tomcat 用 BIO 没有内存限制? 没有内存限制岂不是早就宕机了? 再说说 selector 的问题, 我 NIO 在 readSelector 开 10 个线程去调用 select, 不都是阻塞的吗? 怎么会说在活动状态才占用线程?

然后你会发现这些错误的回答有很多,下面还有大量的小白点赞,觉得说得很对。 但是一经脑子思考就发现, 这绝对是坑 B.

如果有不同意见的小伙伴可以留言,我觉得这个可以作为一个面试题。
17789 次点击
所在节点    Java
154 条回复
jeesk
2022-04-19 12:37:56 +08:00
@yigecaiji 你自己看了源码就知道网上很多都是错误的。
jeesk
2022-04-19 12:40:00 +08:00
@ecric 谁在卷了? 我的标题一直在说 很多文章是错误的这个话题。
relaxchen
2022-04-19 12:40:15 +08:00
确实多,我就说一个
mongodb 的教程里面,有多少链接不上就让你 bindip 0.0.0.0 的
然后被人批量扫库
jeesk
2022-04-19 12:46:26 +08:00
@relaxchen redis 也是吧。 😂
salmon5
2022-04-19 12:49:35 +08:00
java 小白:undertow 性能好,岂不知 tomcat 更适用小白使用
jeesk
2022-04-19 12:50:54 +08:00
@salmon5 管理局没压测过, 不要看网上评论 他们都是扯淡的。
jeesk
2022-04-19 12:51:47 +08:00
@salmon5 @ 如果没有在服务器上面压测过的话, 千万不要相信某某性能高。
salmon5
2022-04-19 12:52:35 +08:00
@jeesk #86
是的,“undertow 的性能好”,网上都是瞎扯蛋
salmon5
2022-04-19 12:53:46 +08:00
@salmon5 #85
某些 java 小白:"undertow 性能好",岂不知 tomcat 更适用小白使用
salmon5
2022-04-19 12:54:35 +08:00
tomcat 的线程模型,更适合粗糙、粗犷的环境
gdgoldlion
2022-04-19 12:59:52 +08:00
“中文互联网的主要问题不是信息太多,而是垃圾信息泛滥”
外网技术圈不是说没有辣鸡,但是整体质量高太多了
jeesk
2022-04-19 13:02:16 +08:00
@gdgoldlion 其实我现在也没明白 ,nio 怎么体现的非阻塞的? 所以我看看能不能给作者发一个邮件, 问问原理
byte10
2022-04-19 13:18:44 +08:00
@Leviathann tomcat 问题不大啊,你应该看看我的那个讲解 会给你展示 tomcat 如何处理高并发的场景,不是它不行,而是大部分人不会用。它 tomcat 也是支持 NIO ,使用 servlet 异步编程,依然可以少量的线程,处理高并发。b 战:小巫老师的 NIO 服务的优势-无视 IO 时间,tomat 单机跑 1w+/s 的 QPS 也问题不大。

@zmal 是的,我已经给 OP 的测试方案了,希望他能研究学习下。
@relaxchen mongodb 不是内网部署吗,相对安全把?被批量扫库是什么意思?
@lisongeee 即便 OP 能拿出数据来,也可能是错的,因为测试的方案就不正确了。

我那个视频有讲解怎么做正确的压力测试的,一般用 jmeter 测试没问题,但是测试 NIO 就需要换一个,可以使用 ab(ApacheBench)和 wrk 压测工具。如果知道 http 协议 那么就应该知道 连接数 是关键因素,但是太多人不清楚了。。。jmeter 适合测试 BIO 的服务,不适合测试 NIO 的服务,建议用 wrk 这个工具。
liuhan907
2022-04-19 13:36:24 +08:00
@jeesk
你认为的几个谬论,实际上都是你自己的理解有些问题。
1. 如果无论是 BIO 和 NIO 你都用 200 线程,确实线程之间的竞争都差不多。但是这里你的问题在于如果用 NIO ,我们使用的线程数量不会是 200 。通常 IO 线程数量选 CPU 核心数 * 2 ,或者再 +2 。比方说如果是四核心,那就是 10 线程左右。
2. Java 的默认线程栈大小就是 1MB 这个其实没什么好多解释的。BIO 比 NIO 的内存消耗更大的原因其实就只是 BIO 需要更多线程。
3.1. 这里其实还是和 1 一样,NIO 使用比 BIO 更少的线程所以内存消耗低,而不是线程池限制了消耗。当然 BIO 下你也没办法用线程池,因为每个连接都会独占一个线程。所以说线程池减少了内存消耗不准确。
3.2. 这里的占用线程指的是操作系统对于线程分配的时间片,不过这里 BIO 和 NIO 一样都是内核等待所以确实是没差别。
frankly123
2022-04-19 13:37:55 +08:00
@MoYi123 10 亿数据照样用
macha
2022-04-19 14:24:24 +08:00
搞 windows 开发都没有文章和书看,只能信自己。现在看起来竟然也算是个优点了。
hello158
2022-04-19 14:26:36 +08:00
错误的知识多了去了。比如说:Java 关于类加载,有个词叫“双亲委派”,当我第一次听到这个词和他的概念的时候,就感觉很怪。字面上来看“双亲”是 父亲母亲的意思(或者你说 2 个父亲也行),那么这个“双亲”从层级上看是 2 层(实际上我可以写多个 classloader 继承,那样就不止 1 层了),且“双亲”给人的感觉是双方是平等的关系(就好比对于我们来说 爸爸妈妈是一个层级,爸爸和爷爷是 2 个层级,显然 BootstrapClassLoader 和 UserDefinedClassloader 不是一个层级,所以双亲的说法太怪了)。

然而,人家的英文名词是啥?—— Parents Delegation Model 这他妈的怎么能翻译成“双亲委派”?!!!你翻译成“父级委派”不行么? 翻译成“向上委派”不行么? 或者你就不翻译,把这个当做一个特殊的词来说,或者你就简称 PDM 就行了。 然而这么多年,都是这么叫的,“双亲委派”,双你老 mu 啊。
raynor2011
2022-04-19 14:55:11 +08:00
你是在说你自己这个帖子吗?错漏百出
xtinput
2022-04-19 14:57:21 +08:00
因为都是复制粘贴的,作者自己都没验证文章就出来了
lmshl
2022-04-19 15:00:36 +08:00
楼主和楼内其他回帖人也犯了不少谬误

我先说下我的实战经验,我有一个 NIO 生产环境服务,落到 JDBC 有 100 QPS ,CPU 消耗不超过 0.2 核心😏

对大部分 CRUD 需要访问数据库,他人 API 的 IO 密集型应用来说,完全 NIO 模型对性能的提升都是碾压级别的,碾过 BIO 渣都不剩。
另一点,JDBC 虽然是阻塞的,但不影响你开固定链接池异步访问,你的应用依然可以按照教科书上 n 核心的 CPU 开 n 个线程的池。

如果你想了解更多 NIO 概念,那应该去看看《响应式设计模式》

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/847761

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX