第 31 章 调整网络性能


调整网络设置是一个复杂的过程,需要考虑很多因素。例如,这包括 CPU 到内存的架构、CPU 核数等。对于大多数场景,Red Hat Enterprise Linux 使用优化的默认设置。然而,在某些情况下,有必要调整网络设置,以提高吞吐量或延迟或解决问题,如数据包丢弃。

31.1. 调整网络适配器设置

在 40 Gbps 及更快的高速度网络中,一些与网络适配器相关的内核设置的默认值可能是数据包丢弃和性能降低的原因。调整这些设置可能会防止此类问题。

31.1.1. 使用 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 使用的驱动程序,环缓冲中的更改可能会短暂中断网络连接。

其他资源

31.1.2. 调整网络设备积压队列以避免数据包丢弃

当网卡接收数据包并在内核协议堆栈处理它们之前,内核将这些数据包存储在积压队列中。内核为每个 CPU 核维护一个单独的队列。

如果核的积压队列满了,则内核丢弃 netif_receive_skb() 内核功能分配给此队列的所有将来传入的数据包。如果服务器包含 10 Gbps 或更快的网络适配器或多个 1 Gbps 适配器,请调整积压队列大小以避免此问题。

先决条件

  • 一个 10 Gbps 或更快的或多个 1 Gbps 网络适配器

流程

  1. 确定是否需要调整积压队列,显示 /proc/net/softnet_stat 文件中的计数器:

    # awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t
    221951548  0      0  0  0  0  0  0  0  0  0  0  0
    192058677  18862  0  0  0  0  0  0  0  0  0  0  1
    455324886  0      0  0  0  0  0  0  0  0  0  0  2
    ...

    awk 命令将 /proc/net/softnet_stat 中的值从十六进制转换为十进制格式,并以表格式显示它们。每行表示以核 0 开始的 CPU 核。

    相关的列有:

    • 第一列:收到的总帧数
    • 第二列:因为积压队列满了而丢弃的帧数
    • 最后一列:CPU 核数
  2. 如果 /proc/net/softnet_stat 文件中第二列中的值随着时间递增,请增加积压队列的大小:

    1. 显示当前积压队列大小:

      # sysctl net.core.netdev_max_backlog
      net.core.netdev_max_backlog = 1000
    2. 使用以下内容创建 /etc/sysctl.d/10-netdev_max_backlog.conf 文件:

      net.core.netdev_max_backlog = 2000

      net.core.netdev_max_backlog 参数设置为当前值的两倍。

    3. /etc/sysctl.d/10-netdev_max_backlog.conf 文件载入设置:

      # sysctl -p /etc/sysctl.d/10-netdev_max_backlog.conf

验证

  • 监控 /proc/net/softnet_stat 文件中的第二列:

    # awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t

    如果值还在增加,请将 net.core.netdev_max_backlog 值再次增加一倍。重复此过程,直到数据包丢弃数不再增加。

31.1.3. 增加 NIC 的传输队列长度,以减少传输错误的数量

内核在传输它们前将数据包存储在传输队列中。默认长度(1000 个数据包)通常对于 10 Gbps 足够,通常对于 40 Gbps 网络也足够。但是,在更快的网络中,或者遇到适配器上的传输错误增加,请增加队列长度。

流程

  1. 显示当前传输队列长度:

    # ip -s link show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    ...

    在本例中,enp1s0 接口的传输队列长度(qlen)是 1000

  2. 监控网络接口的软件传输队列丢弃的数据包数:

    # tc -s qdisc show dev enp1s0
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64
     Sent 16889923 bytes 426862765 pkt (dropped 191980, overlimits 0 requeues 2)
    ...
  3. 如果您遇到较高的或不断增加的传输错误数,请设置更高的传输队列长度:

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

      # nmcli connection show
      NAME                UUID                                  TYPE      DEVICE
      Example-Connection  a5eb6490-cc20-3668-81f8-0314a27f3f75  ethernet  enp1s0
    2. 更新连接配置文件,并增加传输队列长度:

      # nmcli connection modify Example-Connection link.tx-queue-length 2000

      将队列长度设置为当前值的两倍。

    3. 应用更改:

      # nmcli connection up Example-Connection

验证

  1. 显示传输队列长度:

    # ip -s link show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 2000
    ...
  2. 监控丢弃的数据包数:

    # tc -s qdisc show dev enp1s0

    如果 dropped 数还在增加,请再次将传输队列长度增加一倍。重复此过程,直到数不再增加。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.