網路零拷貝技術指的是在資料報文從網路裝置到使用者程式傳遞的過程中,一種減少資料拷貝次數,減少系統呼叫,實現cpu的零參與,從而減輕 cpu負載的技術。
1.1 sylixos網路現狀
sylixos網路使用的是lwip協議棧,其資料報文從網路裝置到使用者程式只需要一次拷貝即可實現。產生這次拷貝的原因是資料報文從網路裝置往協議棧傳輸時,資料格式不一樣。網路協議棧需要專門的資料結構(pbuf)來管理報文,而裝置層只會將資料本身存放在一塊記憶體緩衝區中。
1.2 sylixos零拷貝技術使用前提
sylixos目前版本已經支援網路零拷貝,但這只適用於x86架構的cpu。主要原因是使用零拷貝技術後,網路協議棧對報文資料的管理並不會使用cache。這種方式在arm等架構上使用時,協議棧需要對報文不停的訪問,但由於沒有cache,因此訪問效率反而會降低。
2.1 不使用零拷貝的報文接收流程
不使用零拷貝的資料接收流程如圖 2‑1 所示。
圖 2‑1 不使用零拷貝接收
不使用零拷貝時,報文從網路裝置到使用者應用程式,只會進行一次拷貝操作,這一次拷貝操作位於網絡卡驅動中,即網路裝置在接收到dma搬運的資料報文時,會將報文的內容拷貝到協議棧支援的資料管理結構(pbuf)中。如圖 2‑1 ,拷貝後的報文位於lwip協議棧管理的記憶體區內。
拷貝完成後,協議棧會對pbuf管理的報文做各種分析,最後,通過ipc(程序通訊方式)與使用者程式進行互動。使用ipc就可以不進行資料拷貝,應用程式通過訊號量、訊息郵箱等機制去通知協議棧,讓協議棧進行對應的處理。
2.2 使用零拷貝的報文接收流程
使用零拷貝接收流程如圖 2‑2 所示。
圖 2‑2 使用零拷貝接收
sylixos裡零拷貝是將報文從驅動往協議棧傳送的一次拷貝也省去。實現的思路是讓協議棧可以直接使用驅動收到的網路資料。因此,驅動**需要將用於接收網路報文的資料結構換成協議棧資料管理的結構,即換成pbuf型別。實現的方式是將原本驅動中描述符指向的buf位址換成pbuf結構裡payload指標指向的內容即可。
主要實現流程如下:
-驅動需要建立一塊大的零拷貝pbuf記憶體池(zc_pool),後續的報文接收的pbuf都從零拷貝pbuf池子裡分配;
-驅動初始化描述符時,不呼叫dmamalloc去分配一塊實體地址,而是從上一步分配的零拷貝池子裡獲取乙個零拷貝的pbuf,然後將pbuf所指向的記憶體位址賦值給dma接收描述符;
-此後,網絡卡接收處理函式不需要再做拷貝,而是直接將收到報文的描述符對應的pbuf傳到協議棧,同時按照上一步的方法,給這個完成接收的描述符分配乙個新的零拷貝pbuf。
由於上述申請的零拷貝pbuf型別是custom_pbuf型別,因此經過上述操作後,協議棧對接收到的pbuf進行釋放操作時,會呼叫零拷貝對應的釋放函式。
零拷貝技術
一 應用場景 核心優化 快速拷貝檔案 filechannel至filechannel 二 產生原因 拷貝檔案 傳統傳輸檔案時,資料需要經過4次資料拷貝,分別為磁碟到核心快取 核心到使用者快取 使用者到核心快取 核心到磁碟,頻繁切換使用者態和核心態 三 解決方案 四 引數 引數作用和優點 缺點inpu...
NTZC零拷貝技術
network traffic zero copy 用於捕獲報文的零拷貝計數在網路上有很多的討論,但是目前看來還沒有乙個可用的 開源的實現。最接近的兩個實現 1 pf ring 仍然存在一次的拷貝 2 nta 由於年代較為久遠問題多多。ntzc基本的實現原理如下 1 專用核心模組zc將連續的若干記憶...
網絡卡驅動記憶體零拷貝技術
網絡卡驅動記憶體零拷貝技術實現思路 主要有這麼幾點 1.在核心中為rx分配一片連續的記憶體,再分割成乙個個的小buffer掛到descriptor上 由於linux核心分配大的記憶體塊有限制,所以可以分配幾大塊然後分別掛在descriptor上 2.把記憶體的實體地址傳給使用者空間的收包api.3....