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






