1 收包队列可释放描述符数量阈值(rx_free_thresh)
1.1 收包队列释放的时机
接收队列的主要职责是负责接收和初步处理网络数据包,即将网卡接收到的数据包的物理地址等信息通过描述符传递给DPDK的接收路径。当数据包到达时,接收队列中的描述符被标记为“已使用”,并包含了数据包的物理地址和长度等关键信息。接下来,DPDK的接收路径会读取描述符中的信息,从物理内存中读取数据包的内容,执行必要的处理,比如解封装、错误检测、过滤、分类等。一旦数据包经过了这些处理步骤,并被交付给上层协议或应用程序,其对应的接收描述符就完成了它的使命。这个时候是可以释放的。
1.2 为什么设置rx_free_thresh
设置rx_free_thresh的目的就是批量设置尾部指针寄存器,通过尾部指针寄存器告知硬件该队列资源可用,可以再次收包了。
2 发包队列发送结果报告阈值(tx_rs_thresh)
2.1 tx_rs_thresh的作用
`tx_rs_thresh` 主要用于控制何时将发送队列中的描述符状态设置为“Ring Status”(通常称为RS位)。当DPDK准备发送数据包时,它会填充发送描述符,包括数据包的物理地址和长度等信息。在描述符准备好后,通常需要设置描述符的RS位,以通知网卡这些数据包已经准备好发送。
但是,频繁地更新RS位会导致大量的MMIO操作,这可能会影响性能。因此,DPDK使用`tx_rs_thresh`来延迟更新RS位,直到准备好的描述符数量达到了这个阈值。一旦达到或超过`tx_rs_thresh`,DPDK会批量更新RS位,通知网卡开始发送这批数据包。
3 发包描述符释放阈值(tx_free_thresh)
3.1 tx_free_thresh的作用
`tx_free_thresh` 则用于控制何时将已发送的数据包描述符从发送队列中释放出来,以便它们可以被重新使用。当数据包成功发送后,网卡会标记对应的描述符为“完成”状态,这些描述符随后需要从发送队列中移除,以便DPDK可以重新使用它们来发送新的数据包。
然而,立即更新描述符状态和释放描述符可能会导致频繁的MMIO操作,影响性能。`tx_free_thresh`提供了一个阈值,DPDK会等到完成状态的描述符数量达到或超过这个阈值时,才批量更新描述符状态,将它们从发送队列中释放出来,重新放入描述符池中,供下次发送数据包时使用。
4 总结
(1)tx_rs_thresh控制何时批量更新描述符的RS位,通知网卡发送数据包。
(2)tx_free_thresh控制何时批量释放已完成发送的数据包描述符,以便它们可以被重新使用。
(3)当接收队列中空闲的描述符数量降到rx_free_thresh以下时,DPDK会触发一个事件,促使应用程序向网卡提供更多的描述符,以保证接收队列不会因为空间不足而无法接收新到达的数据包。这有助于避免数据包丢失和接收延迟,从而维持高吞吐量和低延迟的网络性能。