網絡是云計算繞不開的話題,其中主機內部網絡性能開銷最大的就是數據拷貝,那么通常情況下,當網卡接收到數據后,要經過幾次拷貝才能被應用程序接收呢 ?
下圖是一個網卡接收數據的整個流程。
1、當數據包到達網卡依據配置會將網絡數據拷貝到DMA中,并觸發硬件中斷
2、驅動程序將從ring buffer中讀取,填充內核skbuff結構。執行上層協議棧操作
3、socket read操作將數據從內核拷貝到用戶態
可見用戶態看到的數據包需要經過三次數據拷貝,這也限制了linux的網絡性能,所以后期出現了DPDK、數據零拷貝等加速技術。其中DPDK直接使用用戶態IO(UIO),直接旁路內核,如下圖,可以直接將網卡數據拷貝到用戶態,其中Driver有兩部分組成,一部分在內核空間一個部分在用戶空間。Driver主要作用是通過mmap地址映射物理地址和虛擬地址,以處理和禁止中斷(這部分只能在內核空間完成)。