我们有 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. 不要忘记,在这些基准测试中,内核和驱动程序/固件版本起着重要作用。
附言:你可能想安装最新的ixgbe
Intel 驱动程序[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