V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yan17
V2EX  ›  编程

请教一下 OVS DPDK 发送队列

  •  
  •   yan17 · 2021-12-03 11:21:17 +08:00 · 1292 次点击
    这是一个创建于 1104 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    yan17
        1
    yan17  
    OP
       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/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   858 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:17 · PVG 05:17 · LAX 13:17 · JFK 16:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.