NTZC零拷貝技術

2021-05-27 17:16:06 字數 1308 閱讀 3143

network traffic zero copy

用於捕獲報文的零拷貝計數在網路上有很多的討論,但是目前看來還沒有乙個可用的、開源的實現。最接近的兩個實現:

1)      pf_ring(

): 仍然存在一次的拷貝

2)      nta(

):由於年代較為久遠問題多多。

ntzc基本的實現原理如下:

1)專用核心模組zc將連續的若干記憶體頁從核心空間mmap對映到使用者空間,zc模組自行管理分配的記憶體,並且作為dma位址交給網絡卡的驅動收發包使用;

2)網絡卡驅動接到的報文,如果需要交給使用者空間時,該報文的描述符,即報文記憶體指標的頁起始位址和相對偏移位置會被核心放到特定的緩衝區中,等待使用者空間讀取(報文的內容不向使用者空間拷貝,只是傳遞指標和位置);

3)使用者空間和核心模組之間通過共享佇列讀取報文描述符,並且計算出對應的使用者空間位址,即可訪問報文;(核心空間和使用者空間的記憶體位址需要進行轉換);

4)在報文生命週期結束之後,使用者空間負責釋放報文描述符對應的記憶體;

5)使用者空間傳送報文也可採用類似的方法;

6)在ntzc中大量使用無鎖多讀多寫佇列來實現跨核心和使用者空間的通訊,包括報文描述符的傳遞和記憶體關聯,無鎖多讀多寫佇列的實現極大的簡化了系統設計,並且有效實現多網絡卡報文的匯聚。

在ntzc設計中,認為既然使用者空間可以使用足夠低的成本收費報文,因此取消了網絡卡驅動和linux協議棧之間的互動,當然從ntzc關聯的報文記憶體中拷貝乙份出來交給標準協議棧處理也是很容易的事情。

由於有限考慮不對核心打補丁,因此沒有修改sk_buff的記憶體管理機制,而是實現乙個和sk_buff介面語義幾乎一樣,但是記憶體記憶體管理機制發生變化的報文資料結構su_buff,因此使得新網絡卡驅動的修改移植能足夠的簡單。(建立乙個與新驅動sk_buff介面語義一致的su_buff即可)。

ntzc提供乙個配套的使用者空間api介面,用來幫助應用程式方便的訪問零拷貝驅動。對應的收包示例程式也包含在內。

ntzc目前已經足夠的穩定,對於基於intel 82580的網絡卡支援良好,理論上ntzc零拷貝可以支援多種網絡卡的型別,但是目前只能保證在指定的網絡卡硬體上正常執行。

基於intel 82580系列網絡卡和ntzc的配合使用,其報文捕獲效能和多核支援能力已經具備相當優秀的效能。在一定程式上足夠以標準網絡卡的成本實現「專業流量採集卡」的核心功能(報文的捕獲功能,報文過濾功能還有待新增)。

使用者空間了拷貝的實現固然能夠提公升x86上的網路流量處理效能,但是和所有專業、非專用採集卡一樣,畢竟是一種以技巧解決問題的權宜之計。如果需要實現穩定可靠高效能的流量處理方案的話,我們更建議使用專業的高效能網路流量處理平台。

mcbox:

零拷貝技術

一 應用場景 核心優化 快速拷貝檔案 filechannel至filechannel 二 產生原因 拷貝檔案 傳統傳輸檔案時,資料需要經過4次資料拷貝,分別為磁碟到核心快取 核心到使用者快取 使用者到核心快取 核心到磁碟,頻繁切換使用者態和核心態 三 解決方案 四 引數 引數作用和優點 缺點inpu...

SylixOS 網路零拷貝技術

網路零拷貝技術指的是在資料報文從網路裝置到使用者程式傳遞的過程中,一種減少資料拷貝次數,減少系統呼叫,實現cpu的零參與,從而減輕 cpu負載的技術。1.1 sylixos網路現狀 sylixos網路使用的是lwip協議棧,其資料報文從網路裝置到使用者程式只需要一次拷貝即可實現。產生這次拷貝的原因是...

網絡卡驅動記憶體零拷貝技術

網絡卡驅動記憶體零拷貝技術實現思路 主要有這麼幾點 1.在核心中為rx分配一片連續的記憶體,再分割成乙個個的小buffer掛到descriptor上 由於linux核心分配大的記憶體塊有限制,所以可以分配幾大塊然後分別掛在descriptor上 2.把記憶體的實體地址傳給使用者空間的收包api.3....