kafka零拷貝原理解析(高性能)

kafka零拷貝原理

通過網卡直接去訪問系統的內存,就可以實現現絕對的零拷貝了。這樣就可以最大程度提高傳輸性能。通過“零拷貝”技術,我們可以去掉那些沒必要的數據複製操作, 同時也會減少上下文切換次數。

現代的 Unix 操作系統提供 了一個優化的代碼路徑,用於將數據從頁緩存直接傳輸到 Socket; 在 Linux 中,是通過 sendfile 系統調用來完成的。Java 提供了訪問這個系統調用的方法:FileChannel.transferTo API 。

使用 sendfile ,只需要一次拷貝就行,允許操作系統將數據直接從頁緩存發送到網絡上。所以在這個優化的路徑中, 只有最後一步將數據拷貝到網卡緩存中是需要的。


利用操作系統頁緩存

先寫操作系統的頁緩存(Page Cache),然後由操作系統自行決定何時刷到磁盤。

頁緩存是在內存中分配的,所以消息寫入的速度很快。

Kafka 不必和底層的文件系統進行交互,所有繁瑣的 I/O 操作都由操作系統來處理。

Kafka 採用追加寫的方式,避免了磁盤隨機寫操作。使用以 sendfile 為代表的零拷貝技術提高了讀取數據的效率。

使用頁緩存而非堆內存還有一個好處,就是當 Kafka broker 的進程崩潰時,堆內存的數據會丟失,但是頁緩存的數據依然存在,重啟 Kafka broker 後可以繼續提供服務。

kafka零拷貝原理解析(高性能)



分享到:


相關文章: