mellanox&nvidia IB网卡性能调优

目录

一、mellanox&nvidia IB网卡性能调优入门

二、 如何在 PCI、设备、端口和 NUMA 之间进行映射?

 三、如何将端口映射到 CPU (numa_node)?

 四、如何将 PCI(根和函数)映射到 numa_node?

五、如何将 CPU Cores 映射到 NUMA 节点? 

六、如何在特定的 NUMA 节点上运行应用程序? 

七、红帽企业 Linux 网络性能调优指南

7.1 调整网络适配器以提高 IPv4 流量性能 

7.2 重新启动后保留您的 sysctl 设置 

八、BIOS性能调优示例


一、mellanox&nvidia IB网卡性能调优入门

硬件设置:

1. 将您的BIOS 配置为最高性能,请参阅服务器 BIOS 文档并参见此处:

了解用于性能调优的 BIOS 配置

2. 使用适合IB网卡的正确PCIe代。在大多数情况下,您将需要使用:

PCIe Gen3/Gen4

速度 8GT/s

宽度 x8 或 x16(取决于速度)。

注意:如果可用 x16 插槽可能对 x8 IB网卡有用,因为它受益于 CPU 分配的额外缓冲区。

要了解有关 PCIe 性能的更多信息,请参阅了解 PCIe 配置以获得最佳性能并单击此处。

PCIe 宽度决定了设备可以并行使用的PCIe 通道数进行通信。宽度标记为 xA,其中 A 是通道数(例如,x8 表示 8 通道)。Mellanox 适配器支持 x8 和 x16 配置,具体取决于它们的类型。为了验证 PCIe 宽度,可以使用命令lspci。

在此示例中,我们在 PCI 04.00.0 地址上安装了 Mellanox 适配器。

# lspci -s 04:00.0 -vvv | grep Width
LnkCap: Port #0, Speed 8GT/s, Width x8, ASPM not supported, Exit Latency L0s unlimited, L1 unlimited
LnkSta: Speed 8GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

如您所见,PCIe 报告了通信的设备功能(在LnkCap下),以及它们的当前状态(在LnkSta下),这是实际的 PCIe 设备属性。

PCIe 速度

确定可能的 PCIe 事务数。速度以 GT/s 衡量,代表“每秒十亿数据传输”。与 PCIe 宽度一起 确定最大 PCIe 带宽(速度 * 宽度)。

为了验证 PCIe 速度,可以使用命令lspci

# lspci -s 04:00.0 -vvv | grep Speed
LnkCap: Port #0, Speed 8GT/s, Width x8, ASPM not supported, Exit Latency L0s unlimited, L1 unlimited
LnkSta: Speed 8GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

与宽度参数类似,设备功能和状态都会报告。

PCIe 速度被标识为“世代”,其中 2.5GT/s 称为“gen1”,5GT/s 称为“gen2”,8GT/s 称为“gen3”。大多数 Mellanox 产品支持所有世代。您也可以使用命令lspci查看 PCIe 生成:

# lspci -s 04:00.0 -vvv | grep PCIeGen
[V0] Vendor specific: PCIeGen3 x8

PCIe 最大有效负载大小

PCIe Max Payload Size 确定 PCIe 数据包或 PCIe MTU(类似于网络协议)的最大大小。这意味着较大的 PCIe 事务被分解为 PCIe MTU 大小的数据包。此参数仅由系统设置,取决于芯片组架构(例如 x86_64、Power8、ARM 等)。您可以使用命令lspci(在DevCtl下指定)查看 PCIe Max Payload Size 。

lspci -s 04:00.0 -vvv | grep DevCtl: -C 2
DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited

ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+
DevCtl: Report errors: Correctable- Non-Fatal+ Fatal+ Unsupported-
RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+ FLReset-
MaxPayload 256 bytes, MaxReadReq 4096 bytes

PCIe 最大读取请求

PCIe Max Read Request 确定允许的最大 PCIe 读取请求。由于必须为传入的响应准备缓冲区,PCIe 设备通常会跟踪待处理的读取请求的数量。PCIe 最大读取请求的大小可能会影响待处理请求的数量(当使用大于 PCIe MTU 的数据提取时)。同样,使用命令lspci查询最大读取请求值:

# lspci -s 04:00.0 -vvv | grep MaxReadReq
MaxPayload 256 bytes, MaxReadReq 4096 bytes

与此处讨论的其他参数相反,可以在运行时使用setpci命令更改 PCIe 最大读取请求:

首先,查询该值以避免覆盖其他属性:

# setpci -s 04:00.0 68.w

5936第一个数字是 PCIe 最大读取请求大小选择器。

设置选择器索引:

# setpci -s 04:00.0 68.w= 2 936

该值应使用命令lspci更新:

# lspci -s 04:00.0 -vvv | grep MaxReadReq
MaxPayload 256 bytes, MaxReadReq 512 bytes

可接受的值为:0 - 128B、1 - 256B、2 - 512B、3 - 1024B、4 - 2048B 和 5 - 4096B。

注意指定此范围之外的选择器索引可能会导致系统崩溃。

 

计算 PCIe 限制

如前所述,PCIe 功能可能会影响网络适配器性能。最好理解 PCIe 引入的带宽限制。下面是理论计算和几个例子。

最大可能的 PCIe 带宽是通过将 PCIe 宽度和速度相乘来计算的。从这个数字中,我们减少了大约 1Gb/s 的纠错协议和 PCIe 标头开销。开销由 PCIe 编码(有关详细信息,请参阅 PCIe 速度)和 PCIe MTU 确定:

最大 PCIe 带宽 = 速度 * 宽度 * (1 - 编码) - 1Gb/s。

例如,具有x8宽度的第3 代 PCIe 设备将被限制为:

最大 PCIe 带宽 = 8G * 8 * (1 - 2/130) - 1G = 64G * 0.985 - 1G = ~62Gb/s。

另一个例子 - 具有 x16 宽度的第 2 代 PCIe 设备将被限制为:

最大 PCIe 带宽 = 5G * 16 * (1 - 1/5) - 1G = 80G * 0.8 - 1G = ~63Gb/s。

3. 确保您了解服务器的主板架构和NUMA 配置。

对于相关应用程序,使用直接连接到 Mellanox 适配器使用的相关 PCIe 总线的 CPU 内核。请参阅了解用于性能基准的 NUMA 节点。

非统一内存访问 (NUMA) 系统是具有多个系统总线的服务器平台。这些平台可以在单个主板上使用多个处理器,并且所有处理器都可以访问板上的所有内存。当处理器访问不在其自身节点内的内存(远程内存)时,必须以比访问本地内存时更慢的速率通过 NUMA 连接传输数据。因此,内存访问时间并不一致,取决于内存的位置(接近度)和访问它的节点。

这是一个带有两个 CPU 插槽的主板示例。

要获得高性能,您首先需要确定哪个 CPU 将运行应用程序,并确保使用的内存是最接近它的。

安装在 PCIe 链路上的 Mellanox 适配器将连接到其中一个 CPU,在执行基准测试时,您需要从连接到该 PCIe 链路的 CPU 运行测试。

二、 如何在 PCI、设备、端口和 NUMA 之间进行映射?

运行“mst status -v”的最简单方法。

以下是安装了两张卡(ConnectX-4 和 ConnectX-3 Pro)的服务器示例,每张卡都连接到不同的 numa_node。

下面的红线显示在 PCI 地址05:00.0 mlx5_0是缺陷, 用于的端口是ens785f0并且 NUMA 是0

# mst start
...
# mst status -v
MST modules:
------------
MST PCI module loaded
MST PCI configuration module loaded
PCI devices:
------------
DEVICE_TYPE MST PCI RDMA NET NUMA
ConnectX4(rev:0) /dev/mst/mt4115_pciconf0.1 05:00.1 mlx5_1 net-ens785f1 0 
ConnectX4(rev:0) /dev/mst/mt4115_pciconf0 05:00.0 mlx5_0 net-ens785f0 0
ConnectX3Pro(rev:0) /dev/mst/mt4103_pciconf0
ConnectX3Pro(rev:0) /dev/mst/mt4103_pci_cr0 81:00.0 mlx4_0 net-ens817d1,net-ens817 1

 三、如何将端口映射到 CPU (numa_node)?

在同一个示例中,这是查找此信息的另一种方法:

# ibdev2netdev
mlx4_0 port 1 ==> ens817 (Up)
mlx4_0 port 2 ==> ens817d1 (Down)
mlx5_0 port 1 ==> ens785f0 (Down)
mlx5_1 port 1 ==> ens785f1 (Up)
# cat /sys/class/net/ens785f0/device/numa_node
0
# cat /sys/class/net/ens817/device/numa_node
1

 四、如何将 PCI(根和函数)映射到 numa_node?

在同一个示例中,

# lspci -D | grep Mellanox
0000:05:00.0 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4]
0000:05:00.1 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4]
0000:81:00.0 Network controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]

# cat /sys/devices/pci0000\:00/0000\:00\:05.1/numa_node
0 
# cat /sys/devices/pci0000\:00/0000\:00\:05.0/numa_node
0

这是查找此信息的另一种方法:

提示:在大多数情况下,如果适配器安装在以 8 开头的 PCI 地址中(例如:81),它将在 NUMA 1 上。如果它以 0 开头(例如:05),它将在 NUMA 0 中.

注意:当系统不支持 NUMA 架构时,结果预计为-1

五、如何将 CPU Cores 映射到 NUMA 节点? 

 每个 CPU 内核都映射到 NUMA 节点之一。在这个例子中,通过获取 CPU 列表(cpulist)我们可以看到核心 0-13 和 28-41 被映射到 NUMA 0,而其余的被映射到 NUMA 1。

# cat /sys/devices/system/node/node0/cpulist
0-13,28-41
# cat /sys/devices/system/node/node1/cpulist
14-27,42-55

cpumap参数,位图提供了相同的结果。

# cat /sys/devices/system/node/node0/cpumap
000003ff,f0003fff <-- 0-13 & 28-41 bits are ON
# cat /sys/devices/system/node/node1/cpumap
00fffc00,0fffc000 <-- 14-27 & 42-55 bits are ON

六、如何在特定的 NUMA 节点上运行应用程序? 

使用任务集应用程序如下:

首先将ib_send_bw作为服务器运行以获取 PID。

# ib_write_bw &
[1] 45118

 接下来,获取核心关联。

# taskset -p 45118
pid 45118's current affinity mask: ffffffffffffff

在此示例中,此任务可以在所有内核上运行。在我们的示例中,ConnectX-4 连接到 NUMA 0。您可以更改关联掩码以适合 NUMA 0 (0-13,28-41) 使用的内核列表。

# taskset -cp 0-13,28-41 45118
pid 45118's current affinity list: 0-55
pid 45118's new affinity list: 0-13,28-41
# taskset -p 45118
pid 45118's current affinity mask: 3fff0003fff

 在此示例中,您使用-c标志在特定 NUMA 内核上生成任务。

# taskset -c 0-13,28-41 ib_send_bw &
[1] 45292
#
************************************
* Waiting for client to connect... *
************************************

4.为了获得高性能,建议使用最高内存速度和最少 DIMM,并为每个安装的 CPU 填充所有内存通道。

5. 建议在运行性能基准测试(如 sysstat、vmstat、iostat、mpstat、dstat 等)时禁用系统分析器并停止所有监控工具。这些工具使用主机的资源,因此与基准作业并行运行它们可能会根据流量类型和/或模式以及基准的性质在不同程度上影响性能。

6. 对于基准测试,请确保绕过本地缓存(直接写入内存),请参阅HowTo Bypass Local Cache(禁用 tx-nocache-copy)。

 tx-nocache-copy”是一种绕过本地缓存并将用户空间数据直接写入内存的功能。

新内核默认禁用此功能,而在某些 Linux 发行版上启用此功能。

建议禁用此功能,因为它会损害性能。

要禁用tx-nocache-copy,请运行:

# ethtool -K eth1 tx-nocache-copy off

 要启用tx-nocache-copy,请运行:

# ethtool -K eth1 tx-nocache-copy on

 要查看当前配置,请运行:

# ethtool --show-offload eth1 | grep tx-nocache-copy
tx-nocache-copy: off

七、红帽企业 Linux 网络性能调优指南

linux-sysctl-调优

您可以使用 Linux sysctl 命令修改操作系统设置的默认系统网络参数,以提高 IPv4 和 IPv6 流量性能。但是请注意,更改网络参数可能会在不同的系统上产生不同的结果。结果在很大程度上取决于 CPU 和芯片组的效率。

7.1 调整网络适配器以提高 IPv4 流量性能 

建议进行以下更改以提高 IPv4 流量性能:

1、禁用 TCP 时间戳选项以获得更好的 CPU 利用率:

# sysctl -w net.ipv4.tcp_timestamps=0

2、启用 TCP 选择性确认选项以获得更好的吞吐量:

# sysctl -w net.ipv4.tcp_sack=1

3、增加处理器输入队列的最大长度:

# sysctl -w net.core.netdev_max_backlog=250000

 4、使用 setsockopt() 增加 TCP 最大和默认缓冲区大小:

# sysctl -w net.core.rmem_max=4194304
# sysctl -w net.core.wmem_max=4194304
# sysctl -w net.core.rmem_default=4194304
# sysctl -w net.core.wmem_default=4194304
# sysctl -w net.core.optmem_max=4194304

 5、提高内存阈值防止丢包:

# sysctl -w net.ipv4.tcp_rmem="4096 87380 4194304"
# sysctl -w net.ipv4.tcp_wmem="4096 65536 4194304"

6、开启 TCP 低延迟模式:

# sysctl -w net.ipv4.tcp_low_latency=1

 以下变量用于告诉内核应该将多少套接字缓冲区空间用于 TCP 窗口大小,以及为应用程序缓冲区保存多少。

# sysctl -w net.ipv4.tcp_adv_win_scale=1

值为 1 表示套接字缓冲区将在 TCP 窗口大小和应用程序之间平均分配。

7.2 重新启动后保留您的 sysctl 设置 

要在重新启动后保留性能设置,您需要将它们添加到文件中

/etc/sysctl.conf如下:
<sysctl name1>=<value1>
<sysctl name2>=<value2>
<sysctl name3>=<value3>
<sysctl name4>=<value4>

例如,调整网络适配器以提高 IPv4 流量性能(第 16 页)列出了以下设置以禁用 TCP 时间戳选项:

# sysctl -w net.ipv4.tcp_timestamps=0

为了在重新启动后禁用 TCP 时间戳选项,请将以下行添加到

/etc/sysctl.conf:
net.ipv4.tcp_timestamps=0

八、BIOS性能调优示例

展示了如何通过英特尔 E5-2695 CPU 为英特尔 BIOS S2600WT 系列调整 BIOS 的性能。

设置

Intel S2600WT主板

BIOS Bersion 1.01.0009

配置

1、进入 BIOS Startup Menu并选择Advanced。

 

2、展开处理器配置。如果此服务器需要虚拟化,请启用它。

 

3、选择电源和性能对话框,然后从 CPU 电源策略菜单中选择性能。

4、选择Uncore Power Management对话框并将 Uncore Frequency Scaling 和 Performance P-limit 参数设置为Enabled。

 

 5、进入CPU P-State Control对话框,将 Enhanced Intel SpeedStep(R) Tech 设置为Enabled

 6、进入CPU C-State Control对话框,设置 CPU C-State 为Disabled

 7、返回并进入System Acoustic and Performance Configuration对话框,从Set Fan Profile菜单中选择Performance

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值