网络是云计算绕不开的话题,其中主机内部网络性能开销最大的就是数据拷贝,那么通常情况下,当网卡接收到数据后,要经过几次拷贝才能被应用程序接收呢 ?
下图是一个网卡接收数据的整个流程。
1、当数据包到达网卡依据配置会将网络数据拷贝到DMA中,并触发硬件中断
2、驱动程序将从ring buffer中读取,填充内核skbuff结构。执行上层协议栈操作
3、socket read操作将数据从内核拷贝到用户态
可见用户态看到的数据包需要经过三次数据拷贝,这也限制了linux的网络性能,所以后期出现了DPDK、数据零拷贝等加速技术。其中DPDK直接使用用户态IO(UIO),直接旁路内核,如下图,可以直接将网卡数据拷贝到用户态,其中Driver有两部分组成,一部分在内核空间一个部分在用户空间。Driver主要作用是通过mmap地址映射物理地址和虚拟地址,以处理和禁止中断(这部分只能在内核空间完成)。