优化 IO 性能#

网络#

我们建议您为您的网络适配器下载最新的驱动程序和固件。在进行任何更改之前,请联系您的网络适配器供应商,了解本指南中的调优选项是否适用。

NUMA 节点#

始终确保您使用与您的网络适配器在同一 NUMA 域中的本地 CPU 和内存。

要检查您的网络适配器的 NUMA 域,请运行以下命令

cat /sys/class/net/<ethernet interface>/device/numa_node
cat /sys/class/net/<ethernet interface>/device/local_cpulist

IRQ 均衡#

操作系统通常在多处理器系统中将中断分配到所有 CPU 核心,但这可能会导致中断处理延迟。

要在 Linux 上禁用此功能,请运行以下命令

sudo systemctl disable irqbalance

配置中断处理#

网络适配器中的通道是一个 IRQ 和一组可以触发该 IRQ 的队列。通常,您不希望中断队列的数量超过系统中核心的数量,因此请控制 NUMA 域中中断队列的数量。

要设置通道数

在开始之前,停止 irqbalance 服务。

  1. 使用以下命令检查当前设置

    ethtool -l <adapter>
    

    它会告诉您各种队列类型的当前设置。

  2. 设置通道数,例如

    sudo ethtool -L <adapter> combined 16 tx 0 rx 0
    
  3. 要接收和发送(组合),请设置接收队列 (rx)、发送队列 (tx) 或两种类型的组合队列。

  4. 请联系您的供应商获取信息。

对于 NVIDIA Mellanox 网络适配器,要设置适当的中断处理掩码,请调用以下脚本

sudo set_irq_affinity.sh <adapter>

此脚本随 MOFED 安装一起提供。

TX/RX 队列大小#

NIC 的队列大小决定了为 DMA 传输分配多少环形缓冲区。为了帮助防止数据包丢失,我们建议您将大小设置为允许的最大值。您也可以将其设置为最适合您的用例的值。

要查询队列大小的当前设置

ethtool -g enp1s0
Ring parameters for ibp1s0:
Pre-set maximums:
RX: 8192
RX Mini: n/a
RX Jumbo: n/a
TX: 8192
Current hardware settings:
RX: 512
RX Mini: n/a
RX Jumbo: n/a
TX: 1024

要设置 NIC 的队列大小

sudo ethtool -G <adapter> rx <value> tx <value>

大型接收卸载 (LRO)#

根据您的用例,您可以优化最大吞吐量或最佳延迟,但很少两者兼得。大型接收卸载 (LRO) 设置优化了最大网络吞吐量,但是当您启用它时,可能会对网络延迟产生负面影响。请联系您的网络适配器供应商,了解有关是否支持 LRO 以及最佳使用实践的更多信息。

要启用/禁用 LRO

sudo ethtool lro <on|off>

MTU#

当您启动网络接口时,我们建议您将网络适配器的 MTU 设置为巨型帧 (9000)

sudo ifconfig <adapter> <IP_address> netmask <network_mask> mtu 9000 up

要检查当前设置,这是一个您可以运行的示例命令

ifconfig <adapter> | grep mtu

MAX_ACC_OUT_READ#

此设置是 NVIDIA Mellanox 特有的,以下是以下 NIC 的建议值

  • ConnextX-6: 44

  • ConnectX-7: 0(设备将自动调整此配置)

要检查当前设置

sudo mlxconfig -d <dev> query | grep MAX_ACC_OUT_READ

要将此设置设置为建议值

  1. 运行以下命令

    sudo mlxconfig -d <dev> set ADVANCED_PCI_SETTINGS=1
    sudo mlxconfig -d <dev> set MAX_ACC_OUT_READ=<value>
    
  2. 要使此设置生效,请重启系统。

PCIe 最大读取请求#

此设置也是 NVIDIA Mellanox 特有的,可以应用于其他网络适配器。

注意

确保将 MRRS 设置为您的供应商建议的值。

这是一个示例,向您展示如何将 NVIDIA Mellanox NIC 的 MRRS 设置为 4096

sudo setpci -v -d <dev> cap_exp+8.w=5000:7000

此设置在系统重启后不会持久保留。

宽松排序#

将网络适配器的 PCIe 排序设置为宽松有时可以获得更好的性能。有不同的方法可以在网络适配器上启用宽松排序。请联系您的供应商以获取更多信息。

这是一个示例命令,用于检查 NVIDIA Mellanox NIC 上的宽松排序。要使此命令生效,请将 ADVANCED_PCI_SETTINGS 设置为 True(有关更多信息,请参阅 MAX_ACK_OUT_READ)。

sudo mlxconfig -d <dev> query | grep PCI_WR_ORDERING
PCI_WR_ORDERING per_mkey(0)

值 0 表示应用程序或驱动程序确定是否为其内存区域设置 RO。PCI_WR_ORDERING=1 强制对每个 PCIe 入站写入执行 RO,除了完成条目 (CQE) 之外,无论应用程序如何。

  1. 要启用宽松排序

    sudo mlxconfig -d <dev> set PCI_WR_ORDERING=1
    
  2. 重启系统。

.10b PCIe 标签#

理想情况下,PCIe 端点应使用 10b PCIe 标签,以确保它可以发出大量读取请求,从而在系统繁忙时隐藏高读取延迟。请联系您的端点供应商以获取更多信息。

这是一个 ConnectX-7 的示例

setpci -s <bus> -v cap_exp+28.w
1000
  • 如果位 12 为 1,则表示已启用 10b 标签。

  • 如果不是,请设置位 12。

应首先卸载 IB 的驱动程序。

示例

systemctl stop openibd
setpci -s <bus> -v cap_exp+28.w
0040
setpci -s <bus> -v cap_exp+28.w=1040:1040
systemctl start openibd

存储/文件系统#

本节提供有关与存储和文件系统相关的性能调优的信息。

丢弃页面缓存#

当文件从存储读取到 Linux 系统上的内存中时,它们会被缓存在称为页面缓存的未使用内存区域中。要丢弃页面缓存,例如,因为您要对存储子系统进行基准测试,您可能需要在基准测试之前丢弃页面缓存,以查看真实的存储性能。

要丢弃页面缓存,请运行以下命令

echo 3 | sudo tee /proc/sys/vm/drop_caches

要比较从丢弃页面缓存中释放了多少内存区域,请在调用上一个命令之前和之后比较以下命令输出中的 Cached: 行

cat /proc/meminfo | grep Cached