如何使用 10Gb 光纤连接微调 Linux 上的 TCP 性能

如何使用 10Gb 光纤连接微调 Linux 上的 TCP 性能

我们有 2 台 Red Hat 服务器专门用于客户速度测试。它们都使用 10Gb 光纤连接并位于 10Gb 链路上。这些服务器之间的所有网络设备都完全支持 10Gb/s。使用 Iperf 或 Iperf3,我能获得的最佳速度约为 6.67Gb/s。话虽如此,一台服务器正在生产中(客户正在使用它),另一台服务器在线但未被使用。(我们目前使用它进行测试)我应该提到,6.67Gb/s 也是一种方式。我们将它们称为服务器 A 和服务器 B。

当服务器 A 充当 iperf 服务器时,我们获得 6.67Gb/s 的速度。当服务器 A 充当服务器 B 的客户端时,它只能推送大约 20Mb/s。

我做了什么:

到目前为止,我所做的唯一一件事就是将两台服务器上的 TX/RX 缓冲区增加到最大值。一台设置为 512,另一台设置为 453。(仅 RX,TX 已达到最大值)因此,更新后两台服务器的情况如下:

Server A:
Ring parameters for em1:
Pre-set maximums:
RX:     4096
RX Mini:    0
RX Jumbo:   0
TX:     4096
Current hardware settings:
RX:     4096
RX Mini:    0
RX Jumbo:   0
TX:     4096

Server B:
Ring parameters for p1p1:
Pre-set maximums:
RX:     4078
RX Mini:    0
RX Jumbo:   0
TX:     4078
Current hardware settings:
RX:     4078
RX Mini:    0
RX Jumbo:   0
TX:     4078

NICS 如下所示:

Server A: 
ixgbe 0000:01:00.0: em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX

Serer B:
bnx2x 0000:05:00.0: p1p1: NIC Link is Up, 10000 Mbps full duplex,     Flow control: ON - receive & transmit

Server A ethtool stats:
 rx_errors: 0
 tx_errors: 0
 rx_over_errors: 0
 rx_crc_errors: 0
 rx_frame_errors: 0
 rx_fifo_errors: 0
 rx_missed_errors: 0
 tx_aborted_errors: 0
 tx_carrier_errors: 0
 tx_fifo_errors: 0
 tx_heartbeat_errors: 0
 rx_long_length_errors: 0
 rx_short_length_errors: 0
 rx_csum_offload_errors: 123049

 Server B ethtool stats:
 [0]: rx_phy_ip_err_discards: 0
 [0]: rx_csum_offload_errors: 0
 [1]: rx_phy_ip_err_discards: 0
 [1]: rx_csum_offload_errors: 0
 [2]: rx_phy_ip_err_discards: 0
 [2]: rx_csum_offload_errors: 0
 [3]: rx_phy_ip_err_discards: 0
 [3]: rx_csum_offload_errors: 0
 [4]: rx_phy_ip_err_discards: 0
 [4]: rx_csum_offload_errors: 0
 [5]: rx_phy_ip_err_discards: 0
 [5]: rx_csum_offload_errors: 0
 [6]: rx_phy_ip_err_discards: 0
 [6]: rx_csum_offload_errors: 0
 [7]: rx_phy_ip_err_discards: 0
 [7]: rx_csum_offload_errors: 0
 rx_error_bytes: 0
 rx_crc_errors: 0
 rx_align_errors: 0
 rx_phy_ip_err_discards: 0
 rx_csum_offload_errors: 0
 tx_error_bytes: 0
 tx_mac_errors: 0
 tx_carrier_errors: 0
 tx_deferred: 0
 recoverable_errors: 0
 unrecoverable_errors: 0

潜在问题:服务器 A 有大量 rx_csum_offload_errors。服务器 A 是生产服务器,我不禁想到 CPU 中断可能是这里的潜在因素,也是导致我看到的错误的原因。

从服务器 A 执行 cat /proc/interrupts 命令:

122:   54938283          0          0          0          0            0          0          0          0          0          0          0            0          0          0          0          0          0          0           0          0          0          0          0  IR-PCI-MSI-edge      em1-  TxRx-0
123:   51653771          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-1
124:   52277181          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-2
125:   51823314          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-3
126:   57975011          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-4
127:   52333500          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-5
128:   51899210          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-6
129:   61106425          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-7
130:   51774758          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-8
131:   52476407          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-9
132:   53331215          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-10
133:   52135886          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0

如果问题可能出在这里,禁用 rx-checksumming 会有帮助吗?另外,我看到非生产服务器上没有 CPU 中断,这是有道理的,因为它的 NIC 不需要 CPU 时间。

Server A:
 ethtool -k em1
Features for em1:
rx-checksumming: on
tx-checksumming: on
tx-checksum-ipv4: on
tx-checksum-unneeded: off
tx-checksum-ip-generic: off
tx-checksum-ipv6: on
tx-checksum-fcoe-crc: on [fixed]
tx-checksum-sctp: on [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: off
tx-tcp6-segmentation: on
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: on
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: on
highdma: on [fixed]
rx-vlan-filter: on [fixed]
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: on [fixed]
tx-gre-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
fcoe-mtu: off [fixed]
loopback: off [fixed]

除了使用巨型帧(这是不可能的,因为我们的网络设备不支持它们)之外,我还能做什么或检查什么来为我的 10Gb 网络提供最佳的 TCP 性能?6.67Gb/s 不是考虑到其中一台服务器正在生产,我猜想这很糟糕,因为我认为 NIC 会产生 CPU 中断。但在 10Gb 链路上,另一个方向的 20Mb/s 速度简直不可接受。任何帮助都将不胜感激。

服务器 A 规格:x64 24v CPU 32GB RAM RHEL 6.7

服务器 B 规格:x64 16v CPU 16GB ram RHEL 6.7

答案1

在 Linux/Intel 中我将使用以下方法进行性能分析:

硬件:

  • turbostat
    查找核心的 C/P 状态、频率、SMI 数量。[1]
  • cpufreq-info
    查找当前驱动器、频率和调节器。
  • atop
    寻找跨核心的中断分布
    寻找上下文切换、中断。
  • ethtool
    -S 用于统计,查找错误、丢失、溢出、错过的中断等
    -k 用于卸载,启用 GRO/GSO、rss(/rps/rfs)/xps
    -g 用于环大小,增加
    -c 用于中断合并

核心:

  • /proc/net/softirq[2] 和/proc/interrupts[3]
    同样,分布、错过、延迟中断、(可选)NUMA 亲和性
  • perf top
    查看内核/基准测试花费时间的地方。
  • iptables
    查看是否存在可能影响性能的规则(如果有)。
  • netstat -s,,netstat -m查找/proc/net/*
    错误计数器和缓冲区计数
  • sysctl / grub
    这里有很多需要调整的地方。尝试增加哈希表大小、调整内存缓冲区、拥塞控制和其他旋钮。

就您而言,主要问题是跨核心的中断分布,因此修复它将是您最好的行动方案。

PS. 不要忘记,在这些基准测试中,内核和驱动程序/固件版本起着重要作用。

附言:你可能想安装最新的ixgbeIntel 驱动程序[4]。不要忘记阅读那里的 README 并检查脚本目录。它有很多与性能相关的提示。

[0] 英特尔也有关于扩展网络性能的优秀文档
https://www.kernel.org/doc/Documentation/networking/scaling.txt
[1] 你可以将处理器固定到特定的 C 状态:
https://gist.github.com/SaveTheRbtz/f5e8d1ca7b55b6a7897b
[2] 你可以使用以下方法分析这些数据:
https://gist.github.com/SaveTheRbtz/172b2e2eb3cbd96b598d
[3] 你可以通过以下方式设置亲和力:
https://gist.github.com/SaveTheRbtz/8875474
[4]https://sourceforge.net/projects/e1000/files/ixgbe%20stable/

答案2

服务器的规格(品牌和型号)是否相同?您是否对 sysctl.conf 进行了任何更改?

您应该启用 irqbalance 因为您的中断仅发生在 CPU0 上。

如果你没有使用 EL6 的调整配置文件,则应根据计划选择一个接近你的工作负载的配置文件这里

答案3

如果您只运行一个 iperf 实例,则 6 Gb/s 的速度是可以的,因为它仅限于单 CPU 核心。同时运行两个进程应该会给您带来预期的 10Gb/s。

单向 20Mb/s 的问题看起来像是驱动程序/固件/硬件不兼容问题。

我建议您尝试以下故障排除步骤:

您的 NIC 有双端口,因此首先,尝试在两个 NIC 上进行环回速度测试。它可以帮助您确定问题所在:在服务器 A 上还是在服务器 B 上。2. 更换跳线。3. 尝试新的驱动程序。4. 升级固件。5. 更换 NIC)

答案4

我会尝试禁用 LRO(大型接收卸载)...我猜你有一个打开了它的,还有一个关闭了它的。

它依赖于 NIC/驱动程序,但一般来说,当我们在环境中看到它时,我们知道我们错过了一个,然后禁用 LRO

相关内容