一、什麼是Netty零拷貝
Netty是一個基於NIO的客戶端/伺服器框架,可用於快速開發可維護的高性能協議伺服器和客戶端。Netty支持多種編解碼器,例如HTTP和WebSocket,並且可以與非同步編程模型相集成。
而Netty零拷貝,是在Socket傳輸數據過程中,將傳輸過程中的數據轉換為指針傳遞,避免了傳輸時的多次複製數據,從而達到更高的效率。
也就是說,在Netty的實現中,應用程序將數據從磁碟或網路中讀入內存,然後將其寫入其他存儲區域的次數會變得更少,Netty零拷貝減少了CPU周期的浪費,提高了系統的吞吐量。
二、為何使用Netty零拷貝
使用Netty零拷貝,可以有效降低數據複製的開銷,從而提高網路傳輸的效率,主要表現在以下幾個方面:
1、傳輸文件時節省內存開銷
在傳統的Socket通信中,需要使用緩存區將數據讀取到內存中,然後再將數據從內存中複製到Socket緩存區,如果是傳輸大文件時,複製的過程會佔用大量的內存開銷,使用零拷貝技術可以節省這部分內存開銷。
2、減少CPU使用率
在傳統的Socket通信中,數據需要多次複製,這會增加CPU的使用率,使用零拷貝技術可以避免這部分CPU的浪費。
3、減少系統調用次數
當應用程序需要讀取磁碟或網路中的數據時,需要進行多次系統調用。而使用零拷貝技術,可以減少系統調用的次數,提高系統的性能。
三、Netty零拷貝的實現
Netty實現零拷貝技術主要有兩種方式:文件描述符和直接內存緩衝區。
四、使用文件描述符實現Netty零拷貝
文件描述符實現零拷貝技術,是通過將文件讀取和寫入操作全權交給了操作系統進行,應用程序不需要再從內核緩衝區拷貝數據。Java NIO中通過FileChannel.open()方法獲取文件描述符,Netty通過參數傳遞該文件描述符,從而藉助操作系統實現零拷貝。
FileChannel.open(file).transferTo(0, file.length(), socketChannel)
五、使用直接內存緩衝區實現Netty零拷貝
直接內存緩衝區實現零拷貝技術,是通過直接申請堆外內存,並且減少了數據在堆內存中的複製次數來實現。Netty實現中,通過channel.alloc()方法獲取到DirectByteBuffer,並使用writeBytes()方法將數據寫入緩衝區。
channel.write(buffer);
六、使用Netty零拷貝的注意事項
1、Netty的零拷貝協議支持的不是非常廣泛,只支持一些專門的協議如HTTP/1.1和STOMP等。
2、使用Netty的零拷貝技術,需要在合適的場景下使用,否則會導致性能降低。
3、網路協議中的計算機位元組序(大端位元組序或小端位元組序)在不同的計算機上可能會不一樣,因此在使用DirectByteBuffer時,應該使用BigEndian和LittleEndian編解碼器進行位元組序的設置。
七、總結
Netty的零拷貝技術可以降低CPU的使用率,減少內存開銷,提高系統的性能,通過文件描述符和直接內存緩存區兩種方式實現,需要在合適的場景下使用,同時需要注意網路協議中的位元組序問題。
原創文章,作者:GRHH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138312.html