请教一下 OVS DPDK 发送队列

2021-12-03 11:21:17 +08:00
 yan17

关于 OVS dpdk 的接收队列,很多文档都有描述,通过 RSS 等方式让不同的包去往不同的队列,然后不同的队列交给不同的核处理,可以加快处理速度等。但关于发送队列我找到的资料很有限,特别是 OVS-DPDK 的,

  1. 多队列的支持问题,使用虚拟端口 vhostuser 时,源码上面看到至多可配置 1024 个发送接收队列。但物理网卡的队列我不太清楚,应该是物理网卡的实际队列数还是说也可以虚拟很多队列,与网卡的实际队列无关?(对了,有看到说如果存在多个 PMD 访问同一个网卡的话,会为每一个 PMD 准备一个队列,避免冲突)

  2. 在多队列的情况下,网卡是怎么选择从哪一个队列发取包发送诶?

1073 次点击
所在节点    编程
1 条回复
yan17
2021-12-06 13:20:06 +08:00
目前我理解的是对物理网卡单个端口来说,它最多可以使用的队列数就是它的实际队列数,每一个队列都有一段缓存空间,放着对应的描述符队列`rx_ring`,还有`sw_ring`,存放着`*mbuf`。

回到 OVS DPDK 的发包,每一个 PMD 静态分配了一个发送队列 qid (也可以使用 XPS 动态分配队列),对所有发送端口都使用该队列,如有的网卡有 8 个队列,有的只有 4 个队列,在将数据包入队时,会将 qid 与实际端口的最大队列作取余。

现在 PMD 取到了队列,准备将数据包放入发送队列中。放入的过程就是将数据包相关的信息写入到 发包描述符中,其中最关键的有两个,一个就是标识完整的包结束的标志 EOP (End Of Packet),另外一个就是请求报告发送状态 RS (Report Status)。由于一个包可能存放在一个或者多个内存缓冲块里面,需要一个或者多个发包描述符来表示一个等待发送的包,EOP 就是驱动程序用来通知网卡硬件一个完整的包结束的标志。每当驱动程序设置好相应的发包描述符,硬件就可以开始根据发包描述符的内容来发包。

至于多个 PMD 同时往同一个端口的不同队列中写入时,端口如何选择先从哪一个队列发包?
以及多个 PMD 往同一个队列中写入时,需要不需锁?(我在 tx_pkt_burst 源码中没有看到锁,struct igb_tx_queue 队列结构体中也没有锁,在《 dpdk 深入浅出》中说,如果有多个核可能需要同时访问同一个网卡,那么 DPDK 就会为每个核都准备一个单独的接收队列 /发送队列。这样,就避免了竞争,也避免了 Cache 一致性问题。但我的场景是会多个核访问同一个队列.....)

参考: https://www.codenong.com/cs109400686/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/819746

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX