Netty为什么放弃使用AIO
前言
为什么Netty使用NIO,而不使用AIO
NIO和AIO的区别
NIO模型(同步非阻塞)
NIO有同步阻塞和同步非阻塞两种模式,一般讲的是同步非阻塞,服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到一个多路复用器上,多路利用器轮询到连接有I/O请求时才启动一个线程进行处理。
AIO模型 (异步非阻塞)
服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
然后看下Netty作者在这个问题上的原话
Not faster than NIO(epoll) on unix systems (which is true) 译:在UNIX系统上不比NIO快
There is no daragream support 译:不支持数据报
Unnecessary threading model(too much abstraction without usage) 译:不必要的线程模型
所以我们可以总结出以下几点:
- 在LINUX系统上,AIO底层实现仍使用Epoll,没有很好的实现AIO,因此性能上没有明显优势,而且被JDK封装了一层不容易优化
- Netty整体架构是基本reactor模型,而aio是proactor模型,混合在一起会比较混乱
- aio还有个缺点是接收数据需要预先分配缓冲区,而不是NIO那种需要接收时才需要分配缓存,所以对连接数量非常大但流量小的情况,内存浪费很多
- linux上aio不够成熟,处理回调的结果速度跟不到处理需求,供不应求,造成处理速度有瓶颈
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步