干这行久了,会碰到很多"测带宽"测不明白的现场。客户说买了100M专线,表上写的是100M,两台服务器在同一台交换机上,iperf3跑出来只有20M。然后一群人开始怀疑交换机、怀疑防火墙、怀疑线缆,最后发现是iperf3的用法太"基础"——单线程、默认窗口、没有并行流,任何一个环节都能把你压死在低速率上。
iperf3这个工具,几乎所有网工和运维手里都有,但真正把它用好的人不多。百度上搜"iperf3带宽测试",翻来覆去就是一段iperf3 -s加一段iperf3 -c 192.168.1.1,拿来测同一个二层网络勉强够用,一放到跨防火墙、跨地域、多链路负载均衡、容器网络这些场景里,立刻露馅。这篇我按自己平时在项目里用的套路,把复杂网络的带宽测试从头到尾讲清楚,包括多线程怎么开、UDP打流怎么打、窗口大小怎么算、结果怎么解读、踩过的坑怎么避。适合谁看?你只要有网络基础,平时要负责任何链路性能验证、故障排查、设备选型对比,这篇能让你少走很多弯路。
1. 为什么基础iperf3测不准:三个隐藏瓶颈,第一篇教程不会告诉你
先别急着甩参数,先理解一件事:iperf3默认的测法,根本测的不是"链路带宽",而是"一条TCP连接在一台机器上一个CPU核上能跑多快"。复杂网络里的瓶颈往往不在线缆,而在软件栈和设备策略。把下面三个机制想透了,你才知道该用什么参数去突破。
1.1 单线程有天花板:一个CPU核的吞吐上限没那么高
iperf3默认只建立一条TCP流。一条TCP流从发送端到接收端,要经过系统调用、协议栈的校验和计算、网卡驱动、中断处理,这些处理全部落在同一个CPU核上。现代服务器虽然网卡有多队列,但单条TCP连接在绝大多数系统上只会被哈希到固定的一个队列,绑定到一个CPU核。
这里先说个实测现象:在2.5Gbps的链路上,用默认单线程iperf3,通常只能跑出1.2到1.8Gbps;在10Gbps链路上,单线程能跑上个3到4Gbps就已经算不错了。CPU单核性能、网卡驱动效率、DPDK还是内核协议栈,都会直接影响这个天花板。所以当你看到"带宽不达标",第一反不应该是"链路坏了",而是"你只开了一条流,根本没有把链路跑满"。
解决办法就是用并行流,也就是-P参数。一条流压一个核,四条流就压四个核。我一般在测千兆以上链路时,起步就是-P 4;万兆链路直接-P 8甚至-P 16。跑之前先看一眼CPU负载,如果某个核已经打满了,那就说明你压到的是CPU瓶颈而不是链路瓶颈。这个后面结果分析部分再展开。
1.2 默认窗口太小:跨地域高时延链路必死
第二个隐藏瓶颈是TCP窗口。TCP的发送速度受限于一个公式:吞吐率约等于窗口大小除以RTT(往返时延)。也就是常说的带宽延迟积(BDP)。
拿实际场景算一笔账:假设链路带宽是1Gbps,客户端到服务器RTT是20毫秒,那BDP就是:
1Gbps × 0.02秒 = 20Mb ≈ 2.5MB
也就是说,这条TCP连接的理论发送窗口至少要达到2.5MB,才能填满链路。但Linux默认的socket缓冲区可能只有几百KB,窗口扩不起来,吞吐自然上不去。操作系统里tcp_wmem/tcp_rmem的默认值通常比较保守,偏保守的默认值往往不够用。
这种情况下你用不着改系统全局参数(那会影响所有业务流量,风险大),iperf3直接提供了-w参数,专门设置TCP窗口大小。像我测跨地域的链路,通常直接-w 4M或-w 8M,Windows和Linux都认这个参数。
注意:窗口大小不是越大越好。超过BDP很多并不会继续提速,反而浪费内存。稳妥做法是先 ping 测出RTT,再按"带宽 × 1.5倍RTT"估算窗口,然后向上取整设成 4M、8M 这种整数。比如上面那个例子,2.5MB的BDP,设 4M 就够了。
还有一个容易忽略的点:如果链路经过的中间设备(防火墙、IPS)在TCP三次握手里启用了TCP选项裁剪,把窗口缩放因子(Window Scale)去掉了,那即使你设置了大窗口也没用。这个可以通过在两台测试机上抓三次握手包,看SYN报文的Window Scale选项来判断。
1.3 网络设备按五元组哈希:单流的瓶颈卡在设备单核上
第三个坑在中间设备上。现在的防火墙、负载均衡、路由器,很多都基于多核CPU做转发,报文按五元组哈希分配到不同核心。如果你只建立一条TCP流,所有报文都会被哈希到同一个核心,那不管链路多大,都会被设备的单核处理能力卡住。
我曾经在一台低端防火墙后面测200M带宽,单流怎么跑都在70M左右,CPU也显示单核打满。后来加-P 4开了四条并行流,四条流被哈希到四个不同核心,总吞吐直接拉到180M。这几乎是复杂网络里最典型的"测速提不上去"的原因。
所以,在涉及防火墙、负载均衡等中间设备的场景里,多线程不是可选项,是必选项。从另一个角度讲,这其实也是一个很好的测试手段:单流速率差、多流总速率好,说明设备按流哈希转发能力有限,但总处理能力够用;如果多流也提不上去,那就要怀疑设备整体性能或链路本身了。
2. 核心参数详解与选型逻辑:像样带宽测试的标准姿势
这一部分把我在生产环境里真正会用的参数一个个讲透。不要只看命令能跑通,你要知道每个参数解决什么问题、在什么场景下该用不该用。
2.1 并行流与合理流数:-P 怎么开才不算乱开
并行流数量没有标准答案,取决于链路带宽、CPU核数、中间设备处理能力。我的起步经验值是:千兆以内-P 2到-P 4,万兆-P 8到-P 16。但有一个原则:让发送端和接收端的CPU留有裕量,不要让所有核心全部打满。如果CPU已经接近100%,就算继续加流,总吞吐也不会涨上去,反而会增加上下文切换开销。
还要区分并行流和并发进程。iperf3的-P 4是在同一个iperf3进程里创建4条独立连接;如果你需要模拟多个客户端从不同源IP发起测试,可以再指定-B绑定不同源地址,或者开多个终端。比如测负载均衡设备的多IP会话分发,就得用多个源IP、多条会话去打,单一客户端IP配合多条流,哈希粒度可能不够。
2.2 窗口、缓冲区与零拷贝:-w 和 -Z 的实际意义
-w前面已经算过账了。补充一点:-w同时影响发送缓冲区和接收缓冲区,但实际生效值还受系统 tcp_wmem、tcp_rmem 的最大值限制。如果你的有效窗口始终上不去,去检查/proc/sys/net/ipv4/tcp_wmem的第三个数(最大值),必要时临时调大:
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216" sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"这是测试机上的临时调节,不影响业务机器,比较安全。
-Z(--zerocopy)是减少数据拷贝用的,可以显著降低大流量发送时的CPU占用。在万兆链路测试时如果CPU已经成为瓶颈,这个参数值得一试。不过它依赖内核和网卡支持,有些老版本内核或非主流网卡驱动下可能报错,实测不行就用普通模式,结果差异主要在CPU占用率,带宽数据差距通常不大。
2.3 反向与双向测试:-R 和 --bidir 的差别
很多人不知道iperf3到底怎么测"上传"和"下载"。客户端默认是往服务端方向发送数据,也就是说,测的是从client到server的“上行”。只看默认方向,会漏掉另一个方向的问题。
-R(--reverse)就是让服务端往客户端发送,测反方向带宽。你在一台机器上分别跑一次默认和一次-R,两个数字对比,就能判断链路是否对称。我在一些专线测试中,上行和下行差异有时候能到20%以上,两边运营商给的光模块速率不一样、中间策略路由方向不一致,都能导致这种不对称。
--bidir是同时双向打流,适合测那些必须双工同时工作的场景,比如语音、视频会议链路。但要注意,双向同时打流时,如果链路是全双工对称的,每条方向看到的带宽大约只有单向测试的一半,这是正常的。有些人不理解这一点,以为产生性能问题,其实只是没有意识到同时在压两个方向。
2.4 时长与输出解读:-t、-i 决定了测试数据的可信度
测试时长别太短。默认-t 10秒,对于高时延链路,TCP拥塞窗口还在爬坡,数据根本没跑起来就结束了。我在跨地域链路一般用-t 30,在卫星、高丢包链路上甚至用到-t 60。加上-O(--omit)可以丢弃前N秒的数据,跳过慢启动阶段。这个参数很容易被忽略,但对结果精度影响很大:
iperf3 -c 10.10.1.2 -t 30 -O 5 -i 1 -P 4 -w 4M上面的命令含义:总共测30秒,忽略前5秒,每秒打印一条实时数据,4条并行流,窗口4M。加上-i 1之后,你能看到每个时间窗口的吞吐趋势,而不是只能看最终平均值。这一点对定位"忽快忽慢"的问题非常关键。如果最终平均值好看,但中间出现长时间的塌陷窗口,说明链路存在周期性拥塞或流量整形。
输出里有两个关键单位别搞混:MBytes是MiB(1024×1024字节),Mbits/sec是Mbps(10^6比特/秒)。iperf3报告里还有sender和receiver两组数据,分别代表发送端统计和接收端统计。TCP场景下,如果接收端吞吐明显低于发送端,说明网络中有重传,两者差距越大,丢包越严重。这个细节下面结果分析专门讲。
3. 用UDP打流:复杂网络里绕不开的高阶玩法
TCP测速会受到拥塞控制算法影响:丢包了,TCP就会主动降速。这在很多场景下是"正确"的,但也意味着TCP测不出来"链路到底能承载多少流量,只是在测TCP在这个丢包率下的行为"。真要评估链路的原始承载能力、验证QoS限速、测量抖动和丢包率,你得用UDP打流。
3.1 UDP模式的基本操作:-u 配合 -b,逼出链路的真实上限
UDP模式不需要建立连接,不管链路丢不丢包,发送端会按指定速率硬发。命令格式是-u加-b:
iperf3 -c 10.10.1.2 -u -b 500M -t 20 -i 1-b 500M表示以500Mbps的速率持续发送UDP报文。这里有个很重要的事:UDP模式下的带宽数字不是"测出来的结果",而是"你主动设置的发送速率"。实际测出来的结果要看接收端收到了多少、丢了多少。
一般我是这样用的:先根据链路标称带宽,设一个略低于标称值的速率,跑一遍看丢包率是不是0。如果没丢,再逐步往上加,直到出现丢包。这个"刚好开始丢包的临界速率",才是这条链路真实的转发上限。比如一条标称100M的专线,从80M开始打,90M、95M、100M、105M逐级加,记录每档的丢包率,就能画出一条非常直观的"链路承压曲线"。
注意:UDP测速时,
-b指定的速率如果远高于链路能力,丢包率会暴涨。收到大面积的丢包(比如超过20%),接收端看到的带宽甚至可能低于实际出错的水平,因为接收端丢包后,它的统计会非常难看。中间设备还可能触发保护机制,把整条链路暂时性抑制,测完之后记得稍等一会儿再跑下一轮。
3.2 抖动与丢包率:比带宽数值更重要的两个指标
UDP模式输出的报告里,除了带宽,还有两个关键项:Jitter(抖动)和Lost/Total Datagrams(丢包数/总数),以及最终算出的Lost Percent(丢包百分比)。
抖动描述的是端到端时延的变化程度。对于VoIP、实时视频这类业务,抖动比平均延迟更致命。我通常在阈值设置上这么判断:本地网络抖动应在1ms以下,跨地专线稳定时应在2到3ms以内,如果出现5ms以上的抖动,说明链路中出现了拥塞排队或限速整形。
丢包率的概念是所有搞网络的人都懂的,但在iperf3里有个理解差异:如果设置了-b 200M,而链路只承载了150M,那多出来的50M流量是被"丢弃"的,丢包率就会偏高,这是你的预期行为。真正需要警惕的是,在标称速率之下的丢包。比如100M链路打80M就出现0.1%的丢包了,那问题很可能不在带宽容量,而在链路质量、光模块、中间设备缓冲配置上。
3.3 为什么UDP打流最能反映设备转发和QoS策略的真实情况
很多防火墙默认对TCP流量走状态检测,对UDP则可能是低优先级转发;运营商的QoS限速策略也可能针对UDP有另外一套标记。用UDP打流可以逼出这些问题。
举个例子:两家企业之间的专线,负责的团队说做了带宽保障,TCP测速是达标的,但UDP一打到某个速率就丢包,而且从时间窗口看丢包是均匀分布的,这就是典型的流量整形器在起作用——它用令牌桶限制你的PPS或速率,超出的部分被直接丢弃,而不是缓冲后继续转发。这时候光看带宽数值没用,要结合-b速率和丢包率的对应关系去判断。
另外,UDP小包打流还能测PPS(每秒报文数)上限。很多设备的转发瓶颈在"每秒能处理多少个包",而不在"每秒能转多少比特"。比如同样1Gbps速率,用64字节小包打,PPS会非常高,设备CPU可能直接被打满。这个用小包打流的方式也能暴露。注意具体实现上需要改iperf3的UDP包长,用-l指定报文长度:
iperf3 -c 10.10.1.2 -u -b 500M -l 64 -t 30-l 64表示每个UDP报文的有效载荷为64字节。同一速率下包长越小,PPS越高,越能压出设备的处理极限。当然,这时候吞吐带宽会很难看,因为大量报文都是协议头,有效吞吐低是正常的,关注点应该放在PPS上。计算方式是:速率换算成比特后除以(报文长+IP/UDP头40字节+以太网帧开销)再除以8。
4. 复杂网络场景实战:跨防火墙、容器网络、隧道链路的测试要领
参数讲透了,下面落到场景。我挑三个平时最常碰到的复杂场景,把实操过程和注意事项完整写出来。
4.1 跨防火墙和多层路由的测试
跨防火墙测速,比在二层环境要谨慎得多。我在现场执行前,会先确认这几件事:
一是放通端口。iperf3默认端口是5201,TCP和UDP模式如果都用同一个端口,防火墙策略里要把TCP和UDP的5201都放通。很多防火墙策略默认只放TCP,UDP测试时就会一直显示connect failed,这问题特别常见。
二是会话表老化。如果测试时并行流开得多,或者测试时间很长,防火墙的并发会话数要够。我先用-P 4 -t 30这样的小规模测试,再逐步加量,避免一次性并发数太大把防火墙会话表打爆。这个不是夸张,我确实遇到过防火墙并发会话数到上限后新连接直接被丢的情况。
三是MTU一致性。跨路由场景里,如果中间有隧道或MPLS封装,端到端MTU很可能小于1500字节。iperf3默认会按1500字节的MSS发送TCP报文,但路径上如果某个链路MTU更小且ICMP不可达报文被防火墙拦截,就会产生PMTUD黑洞,表现为TCP能通但速率极低,或者大包全部超时。我习惯在测之前,先在两台机器上用ping -M do -s 1472试一下大包通不通;不通就说明路径上有MTU限制,这时候需要临时降低测试网卡的MTU,或者把iperf3的MSS调小(但iperf3没有直接改MSS的参数,通常是在端口或路由上配置mss clamping)。这种问题一旦遇到,不改MTU的话测什么都是白测。
4.2 容器化网络里的带宽测试
现在很多服务跑在Docker容器里,直接在容器里跑iperf3和宿主机之间会有差异,甚至完全测不准。核心问题在几个点上:
Docker默认的bridge网络有NAT和端口映射开销。测试时iperf3服务端如果跑在容器里,映射端口后,数据路径经过了iptables规则、docker-proxy(如果开了)、veth对、bridge,每一层都有处理开销。实测下来,同样的物理链路,容器内iperf3跑出的速率通常比宿主机低不少。所以容器带宽测试,优先使用--network host:
docker run --rm --network host -it --name iperf3-server networkstatic/iperf3 -s docker run --rm --network host -it --name iperf3-client networkstatic/iperf3 -c 10.10.1.2 -P 4 -t 20--network host让iperf3直接使用宿主机的网络栈,绕开NAT和veth,测出来的数字才接近底层链路的真实水平,也方便我们在容器场景里把"容器网络开销"和"物理链路性能"两个问题分开看:先用host模式测底,再用bridge模式测容器网络的额外开销,一对比就知道差在哪。
CPU限制也要注意。容器默认继承宿主机的CPU配额,但如果用--cpus限制了CPU,iperf3跑不满是正常的。之前有个案例,客户在容器里测速只有300M,后来发现容器只分配了0.5个CPU核,iperf3单线程跑不满链路,其实物理链路完全没问题。这个排查思路很值得记下来。
4.3 隧道和叠加网络:开销要算清,别被数字骗了
隧道场景里,比如GRE、VXLAN、IPsec,带宽测试最容易被"数字缩水"迷惑。原因很简单:隧道的每个报文都要额外携带隧道头,原包的MTU被压小了,有效载荷占比下降;如果流量加密,还会消耗大量CPU做加解密。
我测IPsec链路时,会先量一下隧道封装后端到端的MTU是多少。比如物理接口MTU是1500,IPsec封装后可能只剩1400左右。iperf3默认TCP段大小基于路由MTU自动协商,但很多中间设备会把TCP MSS钳制到一个固定值,这时候iperf3测出的带宽,其实是"隧道吞吐",不完全是"物理链路吞吐"。要区分这两者,可以先在没有隧道的情况下测物理链路,再在隧道端到端之间测。两次结果的差值,就是隧道开销。
如果目的是验证隧道是否正常工作,而不是测物理链路极限,我一般直接用UDP模式,设一个略低于物理带宽的速率跑一遍,重点看丢包和抖动。隧道场景下TCP流量可能被PMTUD黑洞干扰,UDP模式反而能更稳定地反应转发能力。-b参数控制速率,-l参数控制报文长度,这两个配合可以把隧道封装后报文是否分片测出来。
5. 结果分析:不要被好看的数字骗了,这些细节才能真正定位问题
跑完iperf3,拿一行带宽数字就交差了?那是最浪费测试的一步。同样的数字,背后可能藏着完全不同的网络状态。我个人分析结果时,固定按下面几个步骤走。
5.1 sender和receiver的差值:重传的信号
看iperf3最后一段汇总报告,如果sender的吞吐高于receiver,差值就是网络中丢包重传的量。TCP是可靠传输,丢失的报文最终会被重传,所以发送端实际发出去了更多数据。在带宽很低的链路上,这个现象尤其明显。差值是1%到3%之间,链路还能用,但已经处于不太稳定的状态;差值超过5%,基本可以判断链路丢包已经比较严重,TCP的拥塞窗口会被频繁砍半,吞吐起不来。
不过iperf3本身只给你汇总值,不告诉你每次重传的分布。要更精确地观察,我会在测试时同时跑sar -n EDEV 1或抓包看TCP重传。抓包定位重传是最直接的:
tcpdump -i eth0 -nn host 10.10.1.1 and host 10.10.1.2 -w /tmp/iperf.pcap然后打开抓包文件,看到序列号回退,或者连续出现Dup ACK,重传和乱序的情况就一目了然了。这里顺手说一句:抓包要抓在两端,只看一端只能看到一半的流量,容易误判。
5.2 CPU占用率:网络性能测试里的"隐性瓶颈"
iperf3的客户端和服务器在报告末尾都会显示CPU利用率。很多人不看这一段,但它往往是"带宽不达标"的真正答案。如果server的CPU利用率已经接近100%,说明接收端处理不过来了,瓶颈不在网络,在机器。同理,client CPU打满,发送端成了瓶颈。
特别是用UDP打流时,CPU开销比TCP更大,因为少了TCP卸载的很多机制,每报文都要走完整协议栈。如果UDP模式测出来的速率比TCP模式还低,且CPU已经打满,那几乎可以断定是CPU瓶颈。这时候可以试试-Z减少拷贝,或者用更专业的工具,比如支持DPDK转发能力的打流工具。多台设备同时测试时,还要注意终端上其他进程占用CPU的情况,这种东西最容易背锅。
提示:想确认CPU是不是瓶颈,最简单的辅助办法是:把
-P从1加到4,看看吞吐是否成倍增长。如果从1条流到4条流总吞吐涨幅很小,且各核CPU已经接近打满,那瓶颈就在本机CPU;如果吞吐随流数线性增长,说明瓶颈在网络侧,加大并行流就能继续逼近真实链路带宽。
5.3 多轮测试与趋势判断:别拿单次结果下结论
iperf3单次结果有随机性,特别是负载高时,TCP拥塞窗口的振荡会让每次结果差异很大。我的习惯是同一个测试条件跑三轮,每轮取平均,保留最高一轮作为参考上限。如果三次数值差距在5%以内,这个结果可信;如果差距超过10%,说明链路状态波动很大,这时候即使平均值好看,也要深入排查一下抖动问题。
用-i 1输出实时窗口还有一个好处——能看到吞吐曲线是否平稳。正常的稳定链路,每秒吞吐应该是一条接近水平的直线,顶多有轻微波动。如果曲线呈现锯齿状、周期性塌陷,说明链路可能有流量整形、拥塞管理或者底层重传机制在工作,这个时候平均值会低估问题的严重程度。我遇到过很多次"平均带宽达标"但"实时窗口频繁跌零"的业务投诉,最终定位到的是某个中间设备的带宽限速策略配置错误。
6. 常见问题与排查技巧实录:这些年踩过的坑,直接做成速查表
下面这组问题,是我在项目现场问得最多、也踩得最多的。我直接按"现象-原因-解法"列出来,有需要可以直接照着排查。
6.1 连接被拒绝或卡住不动
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
unable to connect to server | 服务端没启动、防火墙拦截5201端口 | iperf3 -s确认监听;检查防火墙TCP/UDP 5201放通 |
| 客户端能连但一直卡在等待 | 中间设备拦截UDP、NAT会话老化 | UDP模式先小流量试;检查中间设备会话超时配置 |
| 连接建立但瞬间断开 | 服务端版本与客户端不兼容 | 确认两边都是iperf3(iperf3和iperf2协议不兼容),升级到同版本 |
| 端口被占用 | 之前测试的服务端进程没退出 | `ss -lntp |
很多 "连接不上" 的第一嫌疑其实是防火墙。可以先在客户端和服务端之间用nc -vz 服务端IP 5201测一下端口通不通,这一步能快速区分是策略问题还是iperf3本身的问题。
6.2 双向测试时两个方向差距过大或双向同时测带宽减半
先说减半:如果你用了--bidir,每个方向速率大约是单向的一半,如果链路对称,这其实是符合预期的。但如果两个方向差距超过20%,那就要查链路面板了,比如光模块收发功率不对称、双绞线对绑定策略不同、运营商两条方向走的路径不一致。我处理过的一条专线就是上下行走了不同的物理路由,一个方向的时延比另一个高了整整10ms,这种链路在长文件传输时性能差异会非常明显。
有一个实操细节:双向测试时,iperf3客户端会同时发起两个方向上的数据收发,如果两端机器CPU核数不够,收发进程会争抢同一个核,造成测出来的两个方向都偏低。如果遇到这种情况,用-A参数把服务端接收进程和发送发送端的iperf3绑定到不同CPU核上,结果会准很多。
6.3 速率远低于预期,怎么快速分层定位瓶颈
我排查"带宽不达标"的顺序基本固定,按下面走:
- 先看CPU利用率,排除本机处理能力瓶颈。
- 再跑一轮
-P 4 -w 4M -t 30,排除单线程和窗口瓶颈。 - 然后用UDP以标称带宽的80%打流,看丢包率。如果TCP很差但UDP没问题,说明是TCP层丢包/拥塞问题,重点排查中间设备的应用层策略;如果UDP也丢包,说明链路承载能力或中间设备转发能力有问题。
- 最后在两端同时抓包,看是重传、乱序、大包分片,还是MSS协商异常。
按这个顺序走,大部分"速率不达标"问题半小时内能定位到层。别一上来就抓包,那是在浪费生命;也别一上来就怀疑带宽买少了,那是在给甲方增加恐慌。
6.4 iperf3的局限性与替代方案
最后说句公道话:iperf3不是万能的。它在单机性能测试、链路验证场景里非常顺手,但有些场景它确实不合适。比如iperf3基于单线程事件模型(一个连接几乎对应固定CPU),天然难以测满基于多队列的高性能DPDK转发链路;再比如,iperf3没有内置的HTTP代理、TLS等应用层模拟能力,测应用层性能还得靠别的工具。
替代方案要看具体场景:qperf和nuttcp也走类似思路,但支持RDMA等高级特性;需要模拟真实HTTP流量时,可以用专业的压测工具;要做长时间稳定性验证,iperf3的-t 600甚至更长时间完全够用。日常网络层带宽验证,我仍然推荐iperf3,省事、快、生态广,掌握好参数和解读方式,它基本不会误事。
还有个小技巧,挺多人都不知道:iperf3支持-J输出JSON格式结果,写脚本批量跑测试、自动收集数据时特别方便。我一般用一段简单的循环,把不同-P值、不同-b速率的结果落盘成JSON,然后统一分析,这样比人眼盯屏幕靠谱得多。
for p in 1 2 4 8; do iperf3 -c 10.10.1.2 -P $p -t 30 -J >> result_${p}.json done跑完之后用 jq 解析关键字段,吞吐、丢包、CPU 一项项看,整个链路的"性格"就清楚了。这也是我在复杂网络项目里最常用的收尾手段。