有一个问题想问问大家, 就是 Netty 是异步 I/O,也就是不会在 I/O 的时候不会阻塞,但是 I/O 本身还是耗时的操作,操作系统还是应该需要耗时处理, 效率的提升到底实在什么地方

2019-11-17 11:27:03 +08:00
 iXingo
我就是想不通的地方就是, 所以 Netty 高效的地方就是连接和分发吗,真正 I/O 耗时的处理还是需要底层操作系统慢慢处理, 是这样吗
7341 次点击
所在节点    Java
56 条回复
araaaa
2019-11-17 11:29:57 +08:00
少量线程处理大量连接
iXingo
2019-11-17 11:31:46 +08:00
@araaaa 也就是说主要是先接收大量的连接,然后耗时的操作再慢慢等待处理是吗
lu5je0
2019-11-17 11:32:26 +08:00
netty 是同步 IO
araaaa
2019-11-17 11:37:47 +08:00
@iXingo 去了解下 io 多路复用,和事件轮询。主要作用就是单条线程可以处理复数连接的数据收发
Infernalzero
2019-11-17 11:38:13 +08:00
并不是异步 IO,同步非阻塞
araaaa
2019-11-17 11:40:42 +08:00
@iXingo 耗时操作使用业务线程池,和 netty 线程池分离
iXingo
2019-11-17 12:05:30 +08:00
@Infernalzero 谢谢指正
iXingo
2019-11-17 12:05:46 +08:00
@araaaa 好的,我再研究研究
sandrew1945
2019-11-17 12:06:34 +08:00
0 拷贝
javapythongo
2019-11-17 12:09:18 +08:00
没有提高计算能力,只是能接收更多的请求来处理,如果事 cpu 计算为主,效率就很高
hhx
2019-11-17 12:11:24 +08:00
Netty 应该是非阻塞 IO,和异步 IO 不是一回事。首先你要搞清楚所谓用户态 IO 到底是在干什么,其实很简单,就是在内核缓冲区与用户进程空间之间传送数据。举个例子,调用 BufferedReader 的 readLine 方法,该方法试图读取一行,但问题是该行数据很可能没有准备好,那怎么办呢?阻塞式 IO 的做法是阻塞当前进程,进程进入阻塞态,由 OS 负责在数据准备好时唤醒该进程,然后继续执行 IO。而非阻塞 IO 的做法是跳过执行该 IO 操作,执行后续代码,典型的做法是,不断轮训以检查数据是否准备好。有人会说了,那阻塞式 IO 岂不是更好,因为阻塞时没有占用 CPU,而非阻塞花费了 CPU 时间去轮训。我的观点是,阻塞尽管没有占用 CPU,但是整个程序依然是止步不前的,当处理较多用户连接时,很明显非阻塞方式的交互式更好,响应时间更低,吞吐量也更大。另一方面,阻塞式 IO 占用更多的线程,而非阻塞 IO 可以利用 OS 的 epoll 等系统调用,实现单一线程处理多个连接,明显更适合服务器。至于异步 IO,效率可能更高,但实却非常复杂。
RicardoY
2019-11-17 12:11:39 +08:00
IO 不占用 cpu 的计算时间
RicardoY
2019-11-17 12:19:53 +08:00
@hhx 异步 io 也不是很麻烦吧 写的只需要把数据先给出去 等到可以写的时候内核写 读则是给出缓冲区 能读了内核帮你拷贝过来
liuminghao233
2019-11-17 12:42:31 +08:00
高不高效跟你 Netty 没关系
你用 epoll || kqueue 写出来的东西都是差不多的
相比于一个线程阻塞 n 个连接或者一个线程一个连接来说,io 复用肯定快啊
zmxnv123
2019-11-17 12:45:35 +08:00
本地 io 是 dma 方式的,不占用 cpu 时间,而网络 io 可以认为是网卡操作的,也不占用 cpu 时间。
liumyao
2019-11-17 12:50:44 +08:00
你没搞清楚同步 异步 阻塞 非阻塞
iXingo
2019-11-17 12:55:16 +08:00
@hhx 好的,谢谢。还有 Netty 的 IO 线程主要做的什么操作,是不是不能在 IO 线程中做一些阻塞的操作,而是要把这些操作放在额外的业务线程池中。您能详细讲一下这方面的操作吗
iXingo
2019-11-17 12:55:53 +08:00
@zmxnv123 Netty 主要做的是网络 IO 还是本地 IO
iXingo
2019-11-17 12:57:05 +08:00
@liuminghao233 那您的意思是说其实 Netty 底层也只是调用和封装了操作系统的 select/poll/epoll
opengps
2019-11-17 12:59:17 +08:00
一楼回答跟链接直接,处理大量链接,java 里 netty,c#里 iocp,能实现返利十万以上链接,然而线程只有几个,十几个这样的比例

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

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

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

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

© 2021 V2EX