29.6. 使用 network RHEL 系统角色增加环缓冲的大小,以减少数据包丢弃率

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

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

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

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

重要

当您运行一个使用 network RHEL 系统角色的 play 时,如果设置值与 play 中指定的值不匹配,则角色会使用相同的名称覆盖现有的连接配置文件。要防止将这些值重置为其默认值,请始终在 play 中指定网络连接配置文件的整个配置,即使配置(如 IP 配置)已存在。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户对其具有 sudo 权限。
  • 您知道设备支持的最大环缓冲区大小。

步骤

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure an Ethernet connection with increased ring buffer sizes
          ansible.builtin.include_role:
            name: rhel-system-roles.network
          vars:
            network_connections:
              - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - 198.51.100.20/24
                    - 2001:db8:1::1/64
                  gateway4: 198.51.100.254
                  gateway6: 2001:db8:1::fffe
                  dns:
                    - 198.51.100.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                ethtool:
                  ring:
                    rx: 4096
                    tx: 4096
                state: up

    此 playbook 使用以下设置创建 enp1s0 连接配置文件,或者如果配置文件已存在就更新它:

    • 静态 IPv4 地址 - 198.51.100.20 ,子网掩码为 /24
    • 静态 IPv6 地址 - 2001:db8:1::1 ,子网掩码为 /64
    • IPv4 默认网关 - 198.51.100.254
    • IPv6 默认网关 - 2001:db8:1::fffe
    • IPv4 DNS 服务器 - 198.51.100.200
    • IPv6 DNS 服务器 - 2001:db8:1::ffbb
    • DNS 搜索域 - example.com
    • 环缓冲区条目的最大数量:

      • 接收(RX):4096
      • 传输(TX):4096
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误,但保护有效配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory