优化 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 服务。
使用以下命令检查当前设置
ethtool -l <adapter>
它会告诉您各种队列类型的当前设置。
设置通道数,例如
sudo ethtool -L <adapter> combined 16 tx 0 rx 0
要接收和发送(组合),请设置接收队列 (rx)、发送队列 (tx) 或两种类型的组合队列。
请联系您的供应商获取信息。
对于 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
要将此设置设置为建议值
运行以下命令
sudo mlxconfig -d <dev> set ADVANCED_PCI_SETTINGS=1 sudo mlxconfig -d <dev> set MAX_ACC_OUT_READ=<value>
要使此设置生效,请重启系统。
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) 之外,无论应用程序如何。
要启用宽松排序
sudo mlxconfig -d <dev> set PCI_WR_ORDERING=1
重启系统。
存储/文件系统#
本节提供有关与存储和文件系统相关的性能调优的信息。
丢弃页面缓存#
当文件从存储读取到 Linux 系统上的内存中时,它们会被缓存在称为页面缓存的未使用内存区域中。要丢弃页面缓存,例如,因为您要对存储子系统进行基准测试,您可能需要在基准测试之前丢弃页面缓存,以查看真实的存储性能。
要丢弃页面缓存,请运行以下命令
echo 3 | sudo tee /proc/sys/vm/drop_caches
要比较从丢弃页面缓存中释放了多少内存区域,请在调用上一个命令之前和之后比较以下命令输出中的 Cached: 行
cat /proc/meminfo | grep Cached