29.5. 使用 nmcli 增加环缓冲区大小,以减少高数据包丢弃率

如果数据包丢失率导致应用程序报告数据丢失、超时或其他问题,则可以增加以太网设备的环缓冲区的大小。

接收环缓冲在设备驱动程序和网络接口控制器(NIC)之间共享。该卡分配一个传输(TX)和接收(RX)环缓冲。名称意味着,环缓冲是循环缓冲区,溢出会覆盖现有数据。可以通过两种方法将数据从 NIC 移至内核,硬件中断和软件中断也称为 SoftIRQ。

内核使用 RX 环缓冲区来存储传入的数据包,直到设备驱动程序可以处理它们。设备驱动程序排空 RX 环,通常使用 SoftIRQ,其将传入的数据包置于名为 sk_buffskb 的内核数据结构中,以通过内核直至拥有相关套接字的应用程序开始其过程。

内核使用 TX 环缓冲区来存放应发送到网络的传出数据包。这些环缓冲位于堆栈的底部,是可能会发生数据包丢弃的关键点,进而会对网络性能造成负面影响。

步骤

  1. 显示接口的数据包丢失统计信息:

    # ethtool -S enp1s0
        ...
        rx_queue_0_drops: 97326
        rx_queue_1_drops: 63783
        ...

    请注意,命令的输出取决于网卡和驱动程序。

    discarddrop 计数器中的高值表示可用缓冲区的填满速度快于内核可以处理数据包的速度。增加环缓冲有助于避免此类丢失。

  2. 显示最大环缓冲大小:

    # ethtool -g enp1s0
     Ring parameters for enp1s0:
     Pre-set maximums:
     RX:             4096
     RX Mini:        0
     RX Jumbo:       16320
     TX:             4096
     Current hardware settings:
     RX:             255
     RX Mini:        0
     RX Jumbo:       0
     TX:             255

    如果 Pre-set maximums 部分中的值大于 Current hardware settings 部分中的值,您可以在下一步中更改设置。

  3. 确定使用接口的 NetworkManager 连接配置文件:

    # nmcli connection show
    NAME                UUID                                  TYPE      DEVICE
    Example-Connection  a5eb6490-cc20-3668-81f8-0314a27f3f75  ethernet  enp1s0
  4. 更新连接配置文件,并增加环缓冲区:

    • 要增加 RX 环缓冲区,请输入:

      # nmcli connection modify Example-Connection ethtool.ring-rx 4096
    • 要增加 TX 环缓冲区,请输入:

      # nmcli connection modify Example-Connection ethtool.ring-tx 4096
  5. 重新载入 NetworkManager 连接:

    # nmcli connection up Example-Connection
    重要

    根据 NIC 使用的驱动程序,环缓冲区中的更改可能会很快中断网络连接。