配置网卡多队列的网络中断亲和性及修改网卡多队列数

多队列是指网络接口卡具有在多个发送和接收队列上并行处理网络数据包的能力。在使用网卡多队列时,通常需要配置网络中断亲和性(IRQ Affinity),将不同的队列中断分配给特定的CPU处理,而不是由任意的CPU处理,这有助于减少CPU之间的争用并提高网络性能。本文介绍如何配置Linux系统的网卡多队列的网络中断亲和性和修改网卡多队列数。

前提条件

  • 您的实例规格支持网卡多队列功能。

    支持多队列的实例规格请参见实例规格族,多队列数值大于1时,表示支持网卡多队列。

  • 您的镜像支持网卡多队列功能。

    重要
    • 一些早期上架的公共镜像(内核版本小于2.6)可能不支持网卡多队列,建议您使用最新的公共镜像。

    • 除Red Hat Enterprise Linux以外的镜像已默认支持网络中断亲和性,无需再配置。

      Red Hat Enterprise Linux镜像支持但未开启网卡多队列的网络中断亲和性,您需要按照本文进行配置。

    • 修改网卡多队列数和配置网络中断亲和性是用于优化网络性能的不同方法,您需要根据系统的实际负载情况,通过测试不同的配置组合,观察系统性能(如吞吐量、延迟等指标),合理分配多队列到不同的CPU核心,并相应地设置中断亲和性,确保负载均衡。

配置网络中断亲和性

下述操作以Red Hat 9.2镜像系统为例,介绍如何通过ecs_mq脚本自动配置网卡多队列的网络中断亲和性。如果您的系统镜像并非Red Hat Enterprise Linux,已默认开启,则无需再配置。

  1. 远程连接Linux实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. (可选)关闭irqbalance服务。

    由于irqbalance服务会动态调整IRQ Affinity,配置ecs_mq脚本会和irqbalance产生冲突,建议关闭irqbalance服务。

    systemctl stop irqbalance.service
  3. 执行以下命令,下载最新版本的网卡多队列的自动配置脚本ecs_mq

    wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/ecs_mq/ecs_mq_2.0.tgz

    最新版ecs_mq修复的问题

    最新版ecs_mq相对于旧版ecs_mq修复的问题如下:

    • 根据网卡设备PCIe的NUMA(非统一内存访问)位置,来优先绑定对应的NUMA上的CPU。

    • 优化了多网络设备调优的逻辑。

    • 根据网卡队列数目和CPU数目的比例来进行不同规格的网卡中断绑定逻辑。

    • 优化了根据CPU中sibling的位置进行中断绑定。

    • 解决了旧版绑定中可能跨越NUMA导致的内存访问延迟问题。

    • 默认打开新版开关,同时支持切换新版和旧版的ecs_mq选项开关,切换命令如下:

      • 切换为旧版ecs_mqecs_mq_rps_rfs old

      • 切换为新版ecs_mqecs_mq_rps_rfs new

    说明

    新版ecs_mq相对于旧版ecs_mq,在网络性能测试中,针对大部分PPS、BPS,网络性能提升可达到5%~30%。

  4. 执行以下命令,解压ecs_mq脚本。

    tar -xzf ecs_mq_2.0.tgz
  5. 执行以下命令,更换工作路径。

    cd ecs_mq/
  6. 执行以下命令,运行ecs_mq脚本。

    bash install.sh redhat 9
    说明

    请您根据实际环境替换命令中的 redhat 和 9为您自己的<操作系统名称><操作系统主版本号>

  7. 执行以下命令,启动ecs_mq脚本。

    systemctl start ecs_mq

    启动脚本后,系统自动启动网络中断亲和性。

修改网卡多队列数

下述操作以支持多队列的Alibaba Cloud Linux 3操作系统为例,介绍如何修改网卡多队列数。

说明

根据测试结果,在相同的网络PPS和网络带宽条件下,相较于单个队列,使用两个队列的网络性能提升可达到50%~100%,而使用四个队列的性能提升则更加显著。如何测试网络性能,请参见网络性能测试方法。您可以根据实际需要,修改网卡多队列数。

  1. 远程连接Linux实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 执行ip address show命令,查看网络配置相关信息。

    image

  3. 执行以下命令,查看主网卡eth0支持多队列的情况。

    ethtool -l eth0

    根据返回结果查看是否支持网卡多队列:

    • 如果 "Pre-set maximums" 下的 "Combined" 值大于1,表示网卡支持多队列。

      您可以根据这个最大值来设置当前的队列数:

      执行命令sudo ethtool -L eth0 combined N,其中N是您希望设置的队列数,且N应该小于或等于 "Pre-set maximums" 下的 "Combined" 值。

    • “Current hardware settings”下的“Combined”值表示当前生效的队列数。

    本例中返回表示最多支持2个队列,且当前生效的是1个队列:

    Channel parameters for eth0:
    Pre-set maximums:
    RX: 0
    TX: 0
    Other: 0
    Combined: 2 # 表示最多支持设置2个队列
    Current hardware settings:
    RX: 0
    TX: 0
    Other: 0
    Combined: 1 # 表示当前生效的是1个队列
  4. 执行以下命令,设置主网卡使用2个队列功能。

    sudo ethtool -L eth0 combined 2
  5. 执行以下命令,查看辅助弹性网卡eth1支持多队列的情况。

    ethtool -l eth1

    通过返回信息可以看到,辅助弹性网卡已开启支持多队列。您可以按需继续执行下述操作自定义配置辅助弹性网卡的多队列数。

    Channel parameters for eth1:
    Pre-set maximums:
    RX: 0
    TX: 0
    Other: 0
    Combined: 4 # 表示网卡硬件最多可以支持4个队列
    Current hardware settings:
    RX: 0
    TX: 0
    Other: 0
    Combined: 1 # 表示当前网卡只使用了1个队列
  6. 执行以下命令,设置辅助弹性网卡使用4个队列功能。

    sudo ethtool -L eth1 combined 4

相关文档

如果您需要了解网络中断亲和性的更多信息,请参见IRQ Affinity

如果您需要了解如何创建弹性网卡的,请参见创建辅助弹性网卡

如果您需要了解如何绑定弹性网卡,请参见绑定辅助弹性网卡