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

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.

如果有不同意见的小伙伴可以留言,我觉得这个可以作为一个面试题。
16429 次点击
所在节点    Java
152 条回复
koloonps
2022-04-18 22:10:37 +08:00
Netty 谁会开 200 个线程?一般都是 2*CPU
jeesk
2022-04-18 22:17:29 +08:00
@koloonps 不谈 io. 今天就谈谈网上大量错误的回答和谬论。
statumer
2022-04-18 22:18:36 +08:00
1. 你用 NIO 的时候如果开了 100 个线程,说明要么你的程序是 CPU-bound ,要么是 HTTP 连接处理以外的 IO 全都在用同步网络库(如 JDBC )。后者属于错误用法了。模范用法见 techempower jooby-pgclient 。
2. 建议搞清楚 tomcat 碰到超过 maxThreads 个阻塞 syscall 怎么处理的
3 不解释了,建议写点 libevent 代码搞清楚什么是异步网络编程
singerll
2022-04-18 22:20:36 +08:00
JAVA 初学者都开始关注高并发,线程开销,io 开销了?讲道理你这初学者起点有点高。
pursuer
2022-04-18 22:21:42 +08:00
1 '使用 BIO 上下文切换厉害' 可能是说高并发时多个线程同时运行时的抢占,很多时候其实请求逐个完成就可以,线程频繁切换影响性能。
2 对于长链接应用,开很多线程是比较常见的,如游戏服务器,聊天服务器,开上万个也不是不可能,此时内存消耗就比较大了。
3 select 是通过一个线程监听多个文件描述符状态变化的,因此除非高并发优化否则没必要开 10 个线程去 select
ration
2022-04-18 22:28:19 +08:00
确实很多错误的回答,有些是过时,有些是本来就错误。谷歌,github 相对好点。再者,相对于技术来说,很多新闻啥啥的更不靠谱。所以严谨点,实践才是检验真理的唯一准则。
jeesk
2022-04-18 22:35:54 +08:00
@pursuer 这里我可以说得不太清楚应该是说,1 个线程去监听, 然后 10 个线程去处理 selector 的事件。
hidemyself
2022-04-18 22:38:28 +08:00
那我问下了,NIO 和 BIO 各适用于什么场景呢?
还是说所有可以使用 BIO 的场景,用 NIO 都会效果更好?
james122333
2022-04-18 22:59:01 +08:00
haha 当然不是
但如果你机器非常好
确实不一定得关注这个
jeesk
2022-04-18 23:08:04 +08:00
@statumer tomcat 的 nio 我没有记错的话,tomcat nio 默认确实 worker 是 200 个线程。 所以我就问 bio 和 nio 都开 200 个线程, 那岂不是上下文竞争一样激烈? 我反驳得没有错吧?
jeesk
2022-04-18 23:09:16 +08:00
@ration csdn 和知乎毒瘤不少。 还是得找谷歌,或者 sf 搜索看看老外写的文章。
Vitta
2022-04-18 23:09:38 +08:00
我接触的几个 java 开发都给我一种 java 有本假秘笈,还非常流行的感觉
jeesk
2022-04-18 23:12:53 +08:00
@Vitta 大佬也发我一份, 我也要看这本假秘籍。
chihiro2014
2022-04-18 23:13:42 +08:00
现在还有个毒瘤,叫 simviso ,里面一个叫知秋的天天误导人。。自称国家机密人员,netflix 外包架构师。然后一群小白还挺相信
jeesk
2022-04-18 23:17:59 +08:00
@chihiro2014 大佬你说的是 bilibili 里面的那个吧? webflux 的推广者, 我进群玩过两天, 和知秋大佬天生八字不合, 退群了。
james122333
2022-04-18 23:18:13 +08:00
@jeesk

如果它真的这样搞那么你应该丢掉它 很多专案本来就很糟糕 甚至你改用其它语言
Vitta
2022-04-18 23:19:32 +08:00
@jeesk #13 俺也没有啊,就是怀疑有假秘笈
jeesk
2022-04-18 23:20:43 +08:00
@Vitta 能仔细说说那几个开发怎么发挥的吗? 好奇得不得了。
jeesk
2022-04-18 23:24:21 +08:00
@chihiro2014 我最开始的时候也喜欢看大佬的视频, 发现都是做无用功。 最终放弃,还得自己看源码。
jeesk
2022-04-18 23:31:38 +08:00
@james122333 哈哈, 我从来不讨论哪个语言性能好的问题。 领导让用啥就用啥。

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

https://www.v2ex.com/t/847761

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

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

© 2021 V2EX