前言
為什么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不夠成熟,處理回調的結果速度跟不到處理需求,供不應求,造成處理速度有瓶頸
