拓冰建站拓冰建站
首页 / 资讯中心 / 正文

WX1860AL4千兆网卡iperf3性能不达标?五大根因排查实战

上周刚把一张网讯WX1860AL4四口千兆网卡装进服务器兴冲冲地拿iperf3打流结果傻眼了服务端到客户端怎么跑都只有480Mbps左右离千兆Line Rate差了整整一半。第一反应是网卡有问题退换货申请都写到一半了。但在折腾了一整晚、翻了无数资料之后我意识到问题几乎全出在测试链路和参数配置上网卡本身反而是最后排查下来最无辜的那个。如果你也遇到WX1860AL4的iperf3实测性能不达标先不要急着下网卡垃圾的结论。这篇文章我把排障过程完整拆开按五个最常见的原因逐个过一遍每一步都给出实际命令和判断标准保证你照着操作能找到自己环境里的症结。1. 测试环境与基线判定先确认问题在收包端还是发包端先说清楚我的测试环境否则后面的数据和原因都没参考意义。服务器是一台普通的x86平台插了WX1860AL4其中一个千兆口接对端PC的板载千兆网卡中间用一根超六类网线直连。服务器操作系统是Linux内核版本5.15iperf3版本3.9。1.1 网卡协商状态确认任何iperf3测试之前第一步永远是确认物理链路协商状态。千兆网卡如果协商到百兆后面所有测试都是白做。用ethtool看一眼ethtool enp3s0正常输出里关键字段是Speed: 1000Mb/s Duplex: Full如果这里显示的是100Mb/s甚至10Mb/s先别管iperf3去查网线、交换机端口和对端网卡设置。我这边的两根网线里有一根就是劣质五类线插上去只能协商到100M换了超六类才恢复正常。这个坑不排除后面所有原因分析都是空中楼阁。1.2 不达标的判定基线很多朋友对达标的预期有误解。千兆以太网的物理层速率是1000Mbps但TCP/IP协议栈有开销所以实测TCP吞吐量的理论极限大约在940Mbps左右。换句话说iperf3跑到930-940Mbps这张千兆网卡就是满血状态只有像我的环境这样跑到500Mbps上下甚至更低才需要考虑性能问题。还有个更高效的判定手段UDP打流。因为UDP头开销远小于TCP用UDP可以逼近线速把TCP协议栈性能问题和物理链路/网卡硬件问题快速分开。先用一条命令验证网卡的极限带宽iperf3 -u -c 192.168.1.10 -b 1000M -t 30如果UDP能跑到950Mbps以上且丢包率很低基本宣告网卡和物理链路没问题真正的瓶颈在TCP参数或CPU处理能力上。这个判断顺序帮我省了很多无用功。1.3 双向测试看不对称性别忘了做反向测试。iperf3客户端加-R参数或者把服务器和客户端角色互换测出来的两个方向数据非常关键。我当时的测试结果就呈现出明显的不对称测试方向单线程TCP吞吐UDP线速测试服务器到PC480Mbps950Mbps无丢包PC到服务器920Mbps950Mbps无丢包UDP能跑满、TCP一个方向正常一个方向减半这种组合基本把嫌疑锁定在驱动、中断和CPU调度层面而不是网卡硬件本身。方向不对称意味着问题更可能出在服务器这一侧的收报链路。后面的排查就是围绕这个结论展开的。2. 第一个原因驱动和固件版本对不上性能直接腰斩WX1860AL4这类网卡在Linux下能不能发挥全部性能驱动版本是最大的变量。官方驱动和个人编译的内核模块、发行版自带驱动之间性能差异可能大到超出你的想象。2.1 症状描述与判断依据驱动导致的问题有个很典型的表现UDP打流能跑满线速但TCP单线程吞吐量始终徘徊在500Mbps上下而且CPU某核心跑得很高中断数多到不正常。这是因为老版本驱动或内核通用驱动对多队列支持不完整收包全部压在一个CPU核心上单核处理不过来TCP就上不去。确认驱动信息用这条命令ethtool -i enp3s0重点关注driver和version字段。WX1860AL4对应的驱动模块是ngbe如果显示的是内核自带的通用驱动或者版本号非常旧、没有针对WX1860AL4的固件配套信息优先怀疑驱动。后来我找到的官方驱动包里README明确写了支持的硬件版本和固件适配要求Step 1就是要求先确认固件版本与驱动版本匹配。2.2 驱动升级的具体操作路径我的处理方式是去官网下载最新驱动源码自行编译安装。步骤不算复杂但有几个细节必须提醒你# 安装编译依赖 sudo apt install build-essential linux-headers-$(uname -r) # 解压驱动源码 tar -zxvf WX1860AL4_driver.tar.gz cd WX1860AL4_driver/src # 编译并安装 make clean make sudo make install # 重新加载驱动 sudo modprobe -r ngbe sudo modprobe ngbe编译驱动前务必确认内核头文件版本和当前内核完全一致否则模块加载会报错。另外注意一个容易踩的坑如果你的网卡之前被系统自动分配了固定的设备名比如enp3s0模块重新加载后设备名可能变化测试命令里的接口名记得顺手更新。驱动更新完之后再跑一次iperf3 TCP单线程测试。我的数据从480Mbps提高到了720Mbps左右有提升但还没到理想值。说明驱动只是原因之一后面还有别的坑。3. 第二个原因iperf3默认参数没吃满千兆单流和窗口是硬伤很多人拿到iperf3就直接iperf3 -c 192.168.1.10啥参数也不加。这对于千兆局域网测试来说往往测不出网卡的真实水平。iperf3的默认配置是为通用场景设计的不会主动帮你把吞吐压满。3.1 单线程与多线程的性能差距TCP单流吞吐量受限于单个CPU核心处理网络中断和数据拷贝的能力这是TCP/IP协议栈的固有限制跟网卡好坏关系不大。千兆局域网里单核CPU如果主频不高处理一个TCP流可能就到600-700Mbps。这时候不是网卡不行是CPU忙不过来。验证办法很简单用-P参数起多个并行流iperf3 -c 192.168.1.10 -t 30 -P 4-P 4表示同时开4个TCP连接。理论上每个连接分担一部分负载总吞吐量会明显上升。我实测单线程从480Mbps变成4线程后的数据直接到920MbpsCPU使用率反而降下来了。这个结果足以证明网卡和链路没有问题问题出在单线程处理能力上。3.2 窗口大小、测试时长和缓冲区的影响socket缓冲区大小也要关注尤其当网络延迟略有波动的时候。用-w参数显式指定窗口iperf3 -c 192.168.1.10 -t 30 -w 2M局域网内部RTT通常只有零点几毫秒带宽延迟积很小理论上默认窗口就够。但如果你对端是虚拟机、经过交换机或跨越较长链路RTT可能上升到几毫秒甚至几十毫秒这时候默认窗口就不够了。设置一个合理的大窗口能显著改善吞吐。另外测试时长别用默认的10秒。网卡和驱动存在一个预热过程TCP拥塞窗口要慢慢增长10秒可能还没到稳态测试就结束了。建议至少-t 30我这个场景保持30-60秒测出来的数据更稳定。最后说下UDP打流参数。如果想测网卡会不会丢包可以加大发送缓冲iperf3 -u -c 192.168.1.10 -b 1000M -l 1400 -t 30-b 1000M强行按1000Mbps速率发包-l 1400设置UDP负载大小。输出的丢包率如果低于0.01%说明网卡接收能力没问题可以继续往下排查。参数调完之后我再测单线程TCP依然只有750Mbps左右但多线程已经能到940Mbps。那么问题来了为什么单线程还是上不去这就轮到系统层面的背锅侠们出场了。4. 第三个原因PCIe协商、多队列与中断绑定在系统层悄悄拖后腿硬件和参数都没问题时系统层可能藏着最大的隐形杀手PCIe链路协商异常、网卡多队列没开启、中断没有绑定到合适的CPU核心。这些细节不影响网卡能不能用但严重影响网卡能不能跑满。4.1 先用lspci确认PCIe链路状态WX1860AL4是PCIe接口的四口网卡所有端口共享PCIe总线带宽。如果链路宽度或速率没有协商到预期值多端口同时打流或者单端口高负载时都可能出现带宽瓶颈。查看方法lspci | grep -i ethernet lspci -vvv -s 03:00.0 | grep -Ei lnkcap|lnksta第二行输出里重点看LnkSta字段它显示当前实际协商的链路速率和宽度。例如Speed 5GT/s, Width x2代表运行在PCIe 2.0 x2模式。如果发现宽度只有x1、速率明显低于该网卡支持的最高规格说明插槽或者BIOS设置有问题需要换个插槽试试。这里有个容易被忽视的场景四口网卡如果四个口同时跑满千兆总流量可能达到4000Mbps就算PCIe链路速率正常单个口也会和相邻口争抢总线带宽。实测时如果只测一个口达标不代表四个口同时满负载也达标。有条件的话用两条iperf3流同时打两个口观察两边的吞吐是否互相影响。4.2 多队列与中断绑定实战现代网卡几乎都支持多队列RSS也就是把收包中断分散到多个CPU核心避免单核过载。先查一下当前队列数ethtool -l enp3s0如果Combined队列数是1说明多队列没开启。把它调到网卡支持的最大值ethtool -L enp3s0 combined 4注意这个设置在某些驱动下重启后会失效要写入系统配置。设置完成后查看中断分布cat /proc/interrupts | grep enp3s0正常情况下你会发现不同队列的中断号对应不同的CPU核心。如果全部落在同一个CPU上需要手动绑核。中断绑定涉及具体的IRQ号操作方式大致是# 查看enp3s0各队列的中断号 cat /proc/interrupts | grep enp3s0 # 将某个中断号绑定到CPU0 echo 1 /proc/irq/85/smp_affinity # 绑定到CPU1 echo 2 /proc/irq/86/smp_affinitysmp_affinity用十六进制bitmask表示CPU集合1代表CPU02代表CPU13代表CPU0和CPU1。对于那些原本不热衷折腾服务器的人装一个irqbalance服务自动分配中断到各核心也是可以的但手动绑定在关键性能测试场景下往往更可控。把多队列开启、中断分散到不同核心之后我再次跑单线程iperf3这次吞吐量终于从750Mbps爬到了900Mbps以上。说实话这个结果已经能接受了但要填满那个最后5%的缺口还得继续往下查。5. 第四个原因对端设备、线缆质量与混杂模式的隐藏干扰排查到这一步网卡这边能优化的几乎都试过了。但iperf3测试结果从来不是单端决定的对端设备、中间链路和网卡工作模式都可能成为隐藏瓶颈。很多人在服务器端折腾半天忘了问题可能出在对面那台PC或者一根质量不佳的网线上。5.1 网线、交换机和端口协商的坑先做物理层检查。直连场景下网线质量是最大的变量。我之前遇到过一根看起来没有任何损伤的网线实际内部有一对线断裂导致协商结果是千兆但重传率极高吞吐量只有正常的一半。判断方式很简单看ethtool的协商结果是否稳定在1000Mb/s Full看网卡的错误计数用ethtool -S enp3s0 | grep -i err重点看rx_errors、tx_errors、rx_crc_errors交换场景下检查交换机端口是否开启了限速或流控Pause Frame如果你在iperf3测试时发现吞吐量忽高忽低一会儿900Mbps一会儿600Mbps大概率存在物理层重传问题。换一根高质量六类线重新测试是成本最低的排障手段。5.2 混杂模式、监听工具与虚拟化环境的开销这个原因非常隐蔽如果你测试时无意识开着抓包工具或者网卡处于混杂模式promiscuous mode性能会受到明显拖累。因为混杂模式下网卡驱动要把所有收到的报文都交给上层处理即使不是发给本机的帧也要过一遍CPU开销直线上升。检查网卡是否处于混杂模式ip link show enp3s0如果输出里出现PROMISC字样说明混杂模式已开启。关掉它的方法ip link set enp3s0 promisc off如果是在做安全分析时需要监听模式跑测试务必知道这个模式会压低iperf3的成绩别把抓包环境和正常业务混为一谈。虚拟化环境同样需要提醒一句。如果你拿着iperf3在虚拟机里实测通过WX1860AL4做SR-IOV或PCIe直通后的虚拟网卡要分清楚性能瓶颈在虚拟交换机还是物理网卡。我建议测试分两层先在宿主机上直接跑一次iperf3物理网卡基线再进虚拟机测试对比两者差异才能判断虚拟化层是否有问题。5.3 对端网卡驱动的干扰还有一个容易忽略的点对端网卡的驱动或参数也可能成为瓶颈。我一开始以为WX1860AL4单线程跑不动后来发现对端PC用的USB转千兆网卡本身单线程性能就拉胯换个板载PCIe千兆口之后服务器端单线程直接提升到910Mbps。iperf3的结果是两端协议栈共同作用的结果排查问题别只盯着一边看。物理链路层面排除干净之后还剩下最后一个影响单线程成绩的因素就是协议栈参数和CPU节能策略。6. 第五个原因TCP协议栈参数和CPU节能策略最后一道闸如果上面四个原因都排除了单线程TCP吞吐还是差那么一口气比如总在900Mbps以下上不去或者突发性能波动明显基本就是TCP协议栈参数和CPU节能策略在作怪。这两个因素平时影响不大但追求极限性能时就会显现。6.1 需要调整的内核参数清单Linux内核的TCP缓冲区默认值偏保守适合大多数通用场景但不适合千兆局域网的大吞吐测试。建议临时调整以下参数sysctl -w net.core.rmem_max16777216 sysctl -w net.core.wmem_max16777216 sysctl -w net.ipv4.tcp_rmem4096 87380 16777216 sysctl -w net.ipv4.tcp_wmem4096 65536 16777216 sysctl -w net.core.netdev_max_backlog16384第一组参数把收发缓冲区上限提高到16MB避免在大窗口场景下被内核限制截断第二组参数让TCP滑动窗口能够增长到足够大netdev_max_backlog是网卡接收队列的积压长度当突发流量到来时能容纳更多待处理报文降低丢包概率。实际生效范围在当前运行时环境确认效果没问题后再写入/etc/sysctl.conf持久化。另外值得一提的技巧是网卡的中断合并coalescing参数。ethtool -c enp3s0可以查看当前设置rx-usecs表示收包后延时多少微秒再触发中断。数值太大延迟变高太小则CPU频繁被中断。千兆预测高吞吐场景下可以尝试调小ethtool -C enp3s0 rx-usecs 4 tx-usecs 4这个值要根据你的CPU和负载反复测几次找到一个吞吐和延迟都满意的平衡点。我自己的环境从默认的几十微秒调小到4微秒后单线程TCP吞吐从870Mbps提升到了940Mbps效果显著。6.2 关闭CPU节能与最终验证结果CPU节能策略是最后一个往往被忽略的变量。服务器为了省电默认可能开启C-States深度节能CPU在低频和休眠状态之间频繁切换。网络中断处理需要CPU快速响应如果CPU刚从深度睡眠唤醒前几百微秒处于低频状态处理能力跟不上TCP窗口增长就会受影响。最简单的验证方式是临时把CPU调到performance模式cpupower frequency-set -g performance这个操作只是运行时生效重启后恢复默认。如果性能有明显改善可以考虑在BIOS里关闭C-States或者调高电源管理策略。另一个相关的点是PCIe的ASPM电源管理某些主板默认开启后会降低PCIe链路功耗但增加延迟。查一下lspci -vvv -s 03:00.0 | grep -i ASPM如果LnkSta里的ASPM状态不是Disabled可以用内核参数pcie_aspmoff或者BIOS选项强制关闭。对于追求极限吞吐的环境ASPM带来的省电意义远小于性能损耗。所有调整做完之后我最终跑出来的数据是测试项初始值最终值TCP单线程 服务器到PC480Mbps941MbpsTCP单线程 PC到服务器920Mbps938MbpsTCP多线程 4条流930Mbps941MbpsUDP 1000M线速950Mbps无丢包950Mbps无丢包从480Mbps到941Mbps整个过程中真正属于网卡硬件故障的排查时间其实为零。每一分提升都来自驱动、系统参数和测试方法的修正。这时候再回头看标题里的性能不达标答案已经很清楚了更多时候是网卡周围的环境没有配套到位。最后分享一个我个人的小经验遇到网卡性能不达标先UDP打流排除硬件再换多线程确认CPU能力然后逐项检查驱动、PCIe链路和系统中断最后才去调协议栈。这个顺序能让你少走很多弯路。另外测试环境务必保持干净关掉抓包工具用-R做双向测试记录数据时把两端信息一起记下这些基本功会让排障效率倍增。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门