pcie是报文转发的基础,DMA是网卡和CPU交互的具体方式,这两个知识点就像公路和汽车,外在的硬件已经有了,该启动汽车上路了,所以就有了接下来所讲的内容,dpdk数据的收发包流程。
1.数据包收发
DMA通过描述符的环形队列来与CPU进行交互,环形队列部分在内存中,控制器通过控制访问外设寄存器来控制。
从CPU的角度来看,主要的操作分为系统内存(或者是处理器的缓存)的直接访问,或者外设寄存器MMIO的操作,对于MMIO的操作需要经过pcie总线进行传输
普及一下什么是MMIO? MMIO(Memory-Mapped I/O)是指内存映射I/O,这是一种计算机系统中处理器与I/O设备之间通信的方法。在MMIO机制下,I/O设备的寄存器被映射到处理器的地址空间中,使得处理器可以通过读写内存地址来操作这些I/O设备。
1.1收包流程
![](https://img-blog.csdnimg.cn/direct/ab95f1ed39414841a93f653abd6d33b0.png)
1、CPU将缓存地址填充到接收队列描述符
2、NIC读取接收队列的描述符得知缓存地址的位置
3、NIC将报文的信息填充到缓存地址
4、填充完成之后,向接收队列回写报文填充状态,确认报文已经填写完毕
5、CPU侧读取接收队列的状态信息,确认NIC已经将报文填写完成
6、CPU读取报文信息,进行修改
7、CPU更新报文信息,准备发送报文
总结:
cpu先将缓存的信息暴露给网卡,网卡拿到缓存地址进行填充,通知CPU,我写完了,该你干活了,该过滤过滤,该修改修改。接着CPU上场,cpu读取缓存内容,进行修改,修改完成之后进行更新
注意:两个状态的确认:网卡状态的确认,报文信息是否已经填充完成;cpu状态的确认,cpu状态是否已经填充完成。
1.2 发包流程
8、cpu读发包流程描述符,检查报文是否已经发送完成的标志
9、CPU将准备发送的缓冲区地址填充到发包队列描述符
10、网卡读取发包队列描述符
11、根据发包描述符的地址获取发送报文的信息
12、网卡更新发包队列描述符,标记报文发送完成
2. pcie净荷转发带宽
由于读请求和完成确认是成对出现,所以
{2,10,11}所对应的读请求确认过程是上行流量,
{3,4,12}是上行流量,所以upstream的压力要大于downstream。这里选取64B为例。
(1)包接收方向:64B的数据由于从LAN0开始,偶数周期对齐,所以需要96B
(2)接收方向描述符回写:一个cache line64B对齐,一个包含chache line包含4个描述符,由于从LAN0开始、偶数周期对齐,所以需要96B,一个描述符大小事96/4=24B
(3)发送方向:发送方向由于每32个包菜回写一次,可以忽略
(4)接收方向描述符读请求:
对于读请求,TLP的数据部分为空,故只有24B字节开销。因为82599的偶数时钟周期对齐,所以实际占用32B。同样一次整Cache Line的读,获取4个描述符。计算占用开销:32B/4=8B
(5)发送方向描述符读请求:占用8B
(6)
发送方向,包数据读请求:每个包都有一次读请求,理由同(4),需要32B
所以
每转发一个64字节的包的平均转发开销接近于168
(96+24+8+8+32)
字节。
3. 优化方案
通过收发报文的全景分析,以及单个报文转发的开销,所以基于pcie带宽有以下调优角度
(1)减少MMIO访存的频度
高频度的寄存器MMIO访问,往往是性能的杀手。接收包时,尾寄存器(tail register)的更新发生在新缓冲区分配以及描述符重填之后。只要将每包分配并重填描述符的行为修改为滞后的批量分配并重填描述符。
DPDK是在判断空置率小于一定值后才触发重填来完成这个操作的。
(2)提高pcie传输的效率
每次读描述符或者写描述符都触发一次PCIe事务,显然净荷小,利用率低。如果能把4个操作合并成整Cache Line大小来作为PCIe的事务请求(PCIe净荷为64Byte),带宽利用率就能得到提升。
另外,在发送方向,发送完成后回写状态到描述符。避免每次发送完成就写回,使用批量写回方式(例如,网卡中的RS bit),可以用一次PCIe的事务来完成批量(例如,32个为一组)的完成确认。
(3)尽量避免cache line的部分写
DMA引擎在写数据到缓冲区的过程中,如果缓冲区地址并不是Cache Line对齐或者写入的长度不是整个Cache Line,就会发生Cache Line的部分写。Cache Line的部分写会引发内存访问read-modify-write的合并操作,增加额外的读操作,也会降低整体性能。所以,DPDK在Mempool中分配buffer的时候,会要求对齐到Cache Line大小。
深入浅出dpdk读书笔记--pcie与包处理(二)----dma-CSDN博客