目录
二、 如何在 PCI、设备、端口和 NUMA 之间进行映射?
一、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。