NIC内存管理和RSS队列

时间:2019-10-04 09:39:42

标签: networking nic

我想了解NIC如何管理环形缓冲区的内存。

假设我有Q个大小为N的RSS队列。驱动程序将在内核空间中分配Q个大小为N个数据包的环形缓冲区:

enter image description here

我的问题是,如果OS无法为特定队列拉出或拉慢数据包,并且NIC侧有N个数据包等待拉出,那么硬件方面会发生什么。我可以想象两种情况:

  1. 队列的数据包将“消耗” NIC的所有内存,从而迫使NIC丢弃其他队列的数据包
  2. NIC到达N个数据包时将停止接收该队列的数据包,因此其余队列将不受影响?

谢谢

2 个答案:

答案 0 :(得分:1)

当前的网络堆栈(通常是商用OS)是基于基于简单NIC的模型开发的,这些NIC逐渐为单核CPU供电。当多核计算机成为主流并且软件堆栈的可伸缩性成为一个严重问题时,人们做出了巨大的努力来适应这些模型以利用多核的优势

与NIC硬件中的任何其他规则硬编码一样,RSS的主要缺点是OS对如何将队列分配给流几乎没有影响。

使用更灵活的NIC过滤器或尝试使用系统操作员中提供的软件为流智能分配队列,可以克服RSS的缺点。

下面的ASCII艺术图片描述了硬件接收到两个数据包并向OS发送中断后环的外观:

    +--------------+ <----- OS Pointer
    | Descriptor 0 |
    +--------------+
    | Descriptor 1 |
    +--------------+ <----- Hardware Pointer
    | Descriptor 2 |
    +--------------+
    |     ...      |
    +--------------+
    | Descriptor n |
    +--------------+

当OS接收到中断时,它将读取硬件指针所在的位置,并处理其指针与硬件之间的那些数据包。一旦完成,它就不需要做任何事情,除非它准备了带有新鲜缓冲区的描述符。一旦完成,它将通过写入硬件来更新其指针。例如,如果操作系统已经处理了前两个描述符,然后更新了硬件,则该环将类似于:

    +--------------+
    | Descriptor 0 |
    +--------------+
    | Descriptor 1 |
    +--------------+ <----- Hardware Pointer, OS Pointer
    | Descriptor 2 |
    +--------------+
    |     ...      |
    +--------------+
    | Descriptor n |
    +--------------+

发送数据包时,它是相似的。操作系统填写描述符,然后通知硬件。一旦硬件将它们发送出去,它就会注入一个中断并指出将其写入网络的描述符,从而允许操作系统释放相关的内存。

答案 1 :(得分:0)

这里不是专家,请借此机会学习一些有关高性能网卡如何工作的信息。这个问题似乎取决于您所使用的网络适配器的类型,并且在较小程度上取决于内核(例如,它如何设置硬件)。我可以找到的Linux文档似乎是指bnx2x驱动程序,例如kernel docs以及RHEL 6 docs。就是说,我找不到关于该NIC的技术文档,我对英特尔的运气还不错,我花了一段时间浏览X710 docs

据我所知,队列只是环形缓冲区,因此,如果内核无法足够快地通过数据包,则旧数据包将被新数据包覆盖。我找不到有关RSS的明确记录的行为,但这似乎很有意义

队列基本上也是独立的,因此,如果/在这种情况下,它不会影响其他队列,因此它们的流量应不受影响