Networking NIC内存管理和RSS队列

Networking NIC内存管理和RSS队列,networking,nic,Networking,Nic,我想了解NIC如何管理环形缓冲区的内存 假设我有大小为N的Q个RSS队列。驱动程序将在内核空间中分配大小为N个数据包的Q个环形缓冲区: 我的问题是,如果操作系统无法拉取或缓慢拉取特定队列的数据包,并且NIC端有N个数据包等待拉取,那么硬件端会发生什么情况。我可以想象两种情况: 队列的数据包将“吃掉”NIC的所有内存,从而迫使NIC丢弃其他队列的数据包 当队列达到N个数据包时,NIC将停止接收该队列的数据包,因此其他队列将不受影响 感谢您不是这里的专家,借此机会了解一下高性能网卡的工作原理。这个

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

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

我的问题是,如果操作系统无法拉取或缓慢拉取特定队列的数据包,并且NIC端有N个数据包等待拉取,那么硬件端会发生什么情况。我可以想象两种情况:

  • 队列的数据包将“吃掉”NIC的所有内存,从而迫使NIC丢弃其他队列的数据包
  • 当队列达到N个数据包时,NIC将停止接收该队列的数据包,因此其他队列将不受影响

  • 感谢您不是这里的专家,借此机会了解一下高性能网卡的工作原理。这个问题似乎取决于您使用的网络适配器的类型,在较小程度上取决于内核(例如,如何设置硬件)。我能找到的Linux文档似乎引用了
    bnx2x
    驱动程序,例如和。这就是说,我找不到关于这个网卡的技术文档,我在英特尔的运气好得多,我花了一段时间研究了这个网卡

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


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

    当前的网络堆栈(以及一般的商品操作系统)是从基于简单NIC的模型发展而来的,这些NIC以增量方式为unicore CPU供电。当多核机器变得普遍,软件堆栈的可伸缩性成为一个严重的问题时,人们做出了巨大的努力来调整这些模型以利用多核

    与NIC硬件中的任何其他规则硬编码一样,RSS的主要缺点是操作系统对队列分配给流的方式几乎没有影响

    RSS的缺点可以通过使用更灵活的NIC过滤器或尝试使用系统运营商中烘焙的软件为流智能分配队列来克服

    以下ASCII art图像描述了在硬件接收到两个数据包并向操作系统发送中断后,环路的外观:

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