
iperf3这东西做网络运维和服务器部署的应该都不陌生它是一个开源跨平台的网络性能测试工具经常被用来测量两台机器之间的最大带宽、抖动和丢包率。不过很多朋友一开始接触iperf3都是在Linux上真到了Windows环境反而容易卡在装不上、跑不起来、参数不知道去哪看这几种问题上。这篇文章就专门说说在Windows下怎么把iperf3用顺手从下载安装到参数含义从TCP打流到UDP测丢包再附上我实际踩过的一些坑。适合网络运维、服务器管理员以及所有需要验证“网线插上以后到底能跑多快”的朋友。1. iperf3是什么为什么Windows下测速总绕不开它1.1 一个小工具能测出什么iperf3的核心架构是客户端-服务端模式一台机器上跑iperf3 -s变成“接收端”另一台机器跑iperf3 -c 服务端IP变成“发送端”然后两边不断生成数据流最终算出这段时间内每秒传了多少字节换算成带宽。它不写磁盘直接用内存缓冲所以测出来的速度基本可以当作“纯网络链路能力”不会像复制大文件那样被硬盘、缓存、SMB协议这些因素干扰。它主要能给出几类关键指标TCP模式下能看到吞吐量Bitrate、TCP重传次数Retr和拥塞窗口CwndUDP模式下能看到吞吐量、抖动Jitter和丢包率Lost/Total Datagrams。这些指标对一个网络链路的健康度判断非常有用尤其是当你需要回答“交换机刚换完两台服务器之间到底能不能跑满万兆”这类问题时iperf3是效率最高的答案。1.2 为什么不用iperf2或者在线测速网站我之前遇到过一些朋友反问网上随便找个测速网站不就行了还真不行。在线测速测的是你到互联网某个节点的速度中间隔了运营商、路由策略、DNS等一大堆变量跟内网链路没有直接关系。而Windows自带的复制文件测速又会受到磁盘性能影响SSD和机械硬盘的结果差异巨大根本没法作为标准。iperf2虽然也能测但iperf3是重新设计过的版本最重要的改动是每次测试都是独立的进程不保留历史状态结果重现性好还支持JSON输出方便写脚本采集。我这边测链路质量基本只用iperf3因为它跨平台、免费、参数可控而且Windows、Linux、macOS都能跑同一套命令排障时不用来回换思路。1.3 最适合用iperf3的几个场景我自己常遇到的场景大概是这几类机房新增服务器后验证网卡和交换机端口是否协商正常办公室网络改造后帮同事确认物理链路有没有问题云服务器买了高带宽实际能跑多少语音或视频业务卡顿用UDP打流测抖动和丢包率。可以说只要是能ping通的两台机器iperf3就能帮你量化它们之间的网络质量。2. Windows下安装iperf3下载、解压、三分钟跑起来2.1 下载渠道与版本选择iperf3的源码和官方文档由ESnet维护但Windows下的预编译二进制不是官方直接发的通常需要从iperf官网下载页或GitHub Releases上找第三方编译好的版本。下载时优先选版本号较新的64位包x86_64现在绝大多数Windows机器都该用64位版本。下载下来的通常是一个zip压缩包解压后里面有iperf3.exe和几个DLL文件比如cygwin1.dll或msys-2.0.dll这些是运行环境依赖不能删。解压路径建议放在一个不带空格的目录比如D:\tools\iperf3这样后续在命令行里敲路径时省事不少。2.2 加入PATH环境变量解压完不配置PATH也能用只是每次都要先cd到目录里再执行。更省事的方式是把iperf3所在目录加入系统PATH。操作路径是右键“此电脑” - 属性 - 高级系统设置 - 环境变量 - 在“系统变量”里找到Path - 编辑 - 新建 - 填上D:\tools\iperf3然后一路确定。改完PATH后重新打开一个PowerShell或CMD窗口敲iperf3 -v能看到版本号就说明成功了。注意必须要重开窗口否则新加的PATH不生效这是很多新手卡住的第一步。2.3 PowerShell和CMD下的运行习惯Windows下用iperf3有个小细节如果你直接cd到了解压目录在PowerShell里执行本地exe需要带.\前缀也就是.\iperf3.exe这是PowerShell的安全策略CMD里则不需要。我自己的习惯是配置好PATH后直接敲iperf3这样无论当前在哪个目录都能用。如果运行时报错说“不是内部或外部命令”先检查PATH加对没有如果报“无法加载DLL”大概率是解压时漏了那些DLL文件或者杀毒软件把它们隔离了需要去隔离区恢复并添加信任。3. 核心参数详解从入门到抓狂的参数表3.1 必会的基本参数-s是服务端模式-c是客户端模式并指定目标地址这两个参数是使用iperf3的基础。服务端启动后默认监听5201端口客户端连接时如果不指定端口默认也是5201。注意这个端口跟iperf2不一样iperf2是5001两者不能混用。-u表示UDP模式不指定就是TCP模式。-t控制测试时长默认10秒。-i控制结果打印间隔默认1秒打一次。-b是带宽上限TCP模式下默认不限速UDP模式下默认只有1Mbps这个差异坑了很多人后面展开说。3.2 调整流量形态的参数-P可以并行开多路连接比如-P 4会同时建立4条TCP流。很多情况下单流受限于单核CPU或者TCP窗口跑不满带宽加-P是压满带宽最直接的办法。-w指定TCP窗口大小比如-w 2M但Windows下这个参数经常会被系统自身的TCP自动调优覆盖实际效果需要在具体版本上验证。-l设置缓冲区大小默认128KB一般不用动。-n指定传输多少数据后停止比如-n 100M适合想控制测试时长而不是固定秒数的场景。-R是反向模式默认方向是客户端发给服务端加上-R后变成服务端发给客户端对应实际业务中“下载”方向测试时经常两端都要跑一遍。3.3 高级输出和自动化参数-J输出JSON格式写脚本采集数据时非常方便配合定时任务可以形成长期网络质量记录。--logfile 文件名可以把输出写到文件注意如果要实时写入通常还需要加--forceflush。-O 5表示前5秒结果不计入最终统计适合跳过TCP慢启动阶段测稳定状态下的带宽。--get-server-output能把服务端侧的统计一起拉回来。多网卡机器上-B可以绑定源IP比如两台机器之间有多条链路可以用-B指定从哪块网卡发数据。--bidir是同时双向测试从3.1版本开始支持一边传一边收更接近真实业务场景。-S设置ToS值配合网络设备的QoS策略做差分服务测试这个用得比较少但排查优先级问题时很有用。3.4 参数使用速查表参数作用默认值示例-s服务端模式无iperf3 -s-c IP客户端模式并连接目标无iperf3 -c 192.168.1.100-p 端口指定端口5201iperf3 -c 192.168.1.100 -p 5202-uUDP模式TCP模式iperf3 -c 192.168.1.100 -u-b 带宽带宽上限TCP不限制UDP为1Miperf3 -c 192.168.1.100 -u -b 100M-t 秒测试时长10iperf3 -c 192.168.1.100 -t 30-i 秒打印间隔1iperf3 -c 192.168.1.100 -i 2-P 数量并行流数1iperf3 -c 192.168.1.100 -P 4-R反向测试正向发送iperf3 -c 192.168.1.100 -R-w 大小TCP窗口大小系统默认iperf3 -c 192.168.1.100 -w 2M-n 大小传输数据量按时间iperf3 -c 192.168.1.100 -n 100M-JJSON输出文本输出iperf3 -c 192.168.1.100 -J4. 实操TCP吞吐测试4.1 服务端启动流程在接收端机器上打开一个命令行窗口输入iperf3 -s看到类似Server listening on 5201的提示就代表服务端已经就绪。如果之前测试过端口可能仍被占用可以用netstat -ano | findstr 5201查看进程必要时换一个端口比如iperf3 -s -p 5202。服务端默认会按每秒一行的频率打印客户端的连接信息如果什么都不打印可能是防火墙挡了入站连接。这个在Windows上太常见了后面我会专门讲。4.2 客户端发起TCP打流在发送端机器上执行iperf3 -c 192.168.1.100 -t 10 -i 1客户端连接成功后会先显示一条Connecting to host 192.168.1.100, port 5201然后每秒打印一次当前带宽。测试结束时客户端会出一份汇总包含sender和receiver两个角度的结果。我在Windows上实测过默认单流跑千兆有时只能跑到700多M这不一定代表链路有故障更常见的是Windows TCP栈的默认行为导致单流性能受限。遇到这种情况可以尝试调整TCP全局参数或者直接加-P 4开4路并行往往能看到明显改观。4.3 结果怎么看Retr和Cwnd是关键TCP测试结果里有几个字段需要特别注意。Retr表示TCP重传次数如果这个数字一直往上跳说明链路有丢包TCP在反复重发带宽自然上不去典型原因包括网线质量差、交换机端口协商异常、光模块光功率不足等。Cwnd是拥塞窗口大小它说明当前TCP流的发送窗口被限制在多大如果一直很小说明链路拥塞或丢包影响严重。我每次看到一堆重传第一反应不是怀疑带宽数值而是要查物理链路。先ping对端看延迟有没有抖动再检查网卡协商速率是不是1000Mbps全双工最后看交换机的错误计数。iperf3给的是一个现象原因排查还得靠这些基础手段。4.4 反向测试和并行流如果业务主要是从服务端下载到客户端那么默认方向的测试不能完全代表实际体验建议加-R再跑一遍。我工作里的习惯是正向和反向都要测两条都达标才说明链路真正健康。并行流方面-P 4是最常用的方式。需要注意并行流数加得太多反而会因CPU软中断处理不过来而降低总吞吐尤其在Windows这种桌面系统里网络中断处理不一定能充分发挥多核性能。建议从2、4、8逐步往上加找到当前环境下最合适的值。4.5 多网卡机器的绑源测试有些服务器有管理网口和业务网口默认路由可能走的是错误的那块网卡导致iperf3测试走了旁路链路结果完全没有参考价值。这种场景下用-B指定源IP很有必要比如iperf3 -c 192.168.1.100 -B 192.168.1.101通过绑定源IP确保测试流量确实从指定接口出去。这里还需要确认服务端能路由到这个源IP不然仍然连不上。5. 实操UDP打流与抖动丢包测试5.1 UDP模式适合什么问题UDP打流最典型的用途是模拟语音、视频这种实时UDP业务这类业务对延迟和丢包敏感但对重传不敏感因为等不起重传。通过UDP打流可以量化一条链路的抖动Jitter和丢包率这两个指标直接关系到实时业务的质量。另外UDP测试还能帮助判断设备转发能力。TCP模式因为拥塞控制会自适应降速网络设备缓冲不足时只会表现为吞吐下降UDP则“不管不顾”地按设定速率发包一旦设备处理不过来丢包率立刻显现出来。5.2 UDP服务端和客户端的正确用法服务端还是正常启动iperf3 -s不需要额外参数。客户端的关键在于必须显式指定-b否则UDP模式默认按1Mbps发包结果会让你误以为链路带宽只有1M。比如测试100Mbps UDP负载iperf3 -c 192.168.1.100 -u -b 100M -t 10 -i 1如果想要更细粒度的数据包大小可以通过-l调整UDP包大小比如语音业务常用小包可以用-l 120模拟。这里120是字节数一般建议用业务的实际包大小来测会更贴近真实场景。5.3 如何通过调整负载找出链路真实容量UDP打流最实用的方法是从小到大逐步加压。先按预期带宽的50%测一轮观察丢包率如果丢包率接近0再往上加25%出现明显丢包后回退到丢包率小于0.1%的上一档那条数值基本就是链路当前的稳定承载能力。我之前在一段跨楼层的千兆网络上测试-b 500M时丢包率几乎为0加到-b 800M时丢包率直接飙到3%以上。后来检查发现问题不在两端服务器而是中间交换机的端口缓冲太小大流量突发时缓冲区直接被填满。UDP打流这种“硬灌”方式很容易把这类隐藏问题暴露出来。5.4 Jitter和丢包率怎么解读UDP测试结果末尾会有一段汇总里面的Jitter是抖动值单位是毫秒数值越小说明包到达时间的稳定度越高。对语音业务来说抖动超过20ms就会明显感觉声音断续对视频会议来说抖动超过30ms也会有感知。Lost/Total Datagrams是丢包统计括号里的百分比是丢包率实时业务一般建议控制在0.1%以内。如果UDP测试结果出现丢包同时抖动也很大基本可以断定链路某处存在拥塞或缓冲不足。这时候不要光盯着带宽数值看而要结合网络设备的流量统计和错误计数定位丢包发生在哪一段链路。6. Windows环境特有坑与实战排障6.1 防火墙拦你没商量Windows默认自带的安全策略会拦截外部传入的iperf3连接。最典型的现象是服务端已经iperf3 -s启动了但客户端执行iperf3 -c一直报unable to connect to server而服务端那边一个连接日志都没有。这时候十有八九是Windows防火墙挡了5201端口。两种解决办法。第一种是在服务端首次运行时弹出的防火墙询问窗口里勾选“专用网络”并允许访问第二种是直接用命令添加规则netsh advfirewall firewall add rule nameiperf3 TCP dirin actionallow protocolTCP localport5201 netsh advfirewall firewall add rule nameiperf3 UDP dirin actionallow protocolUDP localport5201推荐第二种方式因为写成了命令以后在多台Windows服务器上批量操作时方便复制。测试完成后如果不在生产环境保留这个端口记得用netsh advfirewall firewall delete rule nameiperf3 TCP删掉规则。6.2 杀毒软件和SmartScreen的误报由于Windows版iperf3多数是第三方编译的没有正规签名证书SmartScreen经常会弹一个蓝色警告窗提示“Windows已保护你的电脑”。这时候选择“仍要运行”就行。有些第三方杀毒软件甚至会把iperf3.exe直接隔离解压完发现文件消失多半就是这个原因。遇到这种情况先把iperf3所在目录加入杀毒软件的白名单再重新解压一遍。公司统一管理的电脑如果装了安全终端可能还会拦截本地监听端口那就得找安全团队申请白名单这个属于组织管理层面的问题绕不开。6.3 TCP栈自动调优对结果的影响Windows从Vista开始引入了TCP接收窗口自动调优正常情况下是好事能根据链路质量自动调整窗口。但在某些网络环境里自动调优反而会限制大带宽高延迟链路的吞吐导致iperf3单流测试结果明显偏低。如果怀疑是这个问题可以查看当前的调优状态netsh interface tcp show global里面的接收窗口自动调优级别如果显示为disabled就是有人手动关过可能导致窗口被限制在64KB长肥管道高带宽高延迟链路吞吐上不去。可以尝试恢复为正常状态netsh interface tcp set global autotuninglevelnormal改完要重开iperf3测试。注意这个操作会影响系统TCP行为生产服务器上修改前最好先跟负责系统的人确认并且记录好原始配置方便回滚。6.4 常见问题速查表现象可能原因排查与解决办法客户端报unable to connect服务端没启动、端口不对、防火墙拦截检查服务端窗口netstat -ano能连接但没有任何数据流服务端防火墙拦了入站数据放行TCP 5201不要只放行UDPTCP测速只有几百Mbps单流受限、TCP窗口不足、中间链路丢包加-P 4检查Retr调整autotuninglevelUDP测速只有1Mbps没加-b参数加-b 100M重试UDP丢包率过高负载超出链路能力、设备缓冲不足降低-b检查中间交换机端口统计提示无法定位程序输入点DLL缺少运行库或版本不匹配换官方或正规第三方预编译版本保持DLL完整连接后立刻断开杀毒软件拦截或服务端崩溃查看服务端窗口报错恢复被隔离文件6.5 一个绕不开的坑CPU性能瓶颈UDP打流时如果带宽很高比如跑万兆Windows端的CPU会被大量中断和拷贝操作占满测试结果反而受制于CPU性能而不是网络链路。我碰到过一次服务端是台老旧的Windows Server 2008千兆网卡跑到600Mbps后就再也上不去CPU已经100%。这种情况加网卡队列、调高中断亲和性可能会有帮助但也有天花板毕竟机器老了。所以在做高带宽测试时建议提前打开任务管理器看一眼CPU占用率。如果CPU接近100%那测试结果就不能反映链路的真实上限只能说明单机处理能力有限。这时候可以把测试机器换到性能更好的物理机上或者改用多队列网卡。7. 从测试到诊断如何用iperf3定位网络瓶颈7.1 分层排查的思路iperf3给出的是一个端到端的综合结果真正要定位瓶颈得从几个层面逐步拆解。我自己的排查顺序是这样的先看链路协商状态确认两端网卡都工作在正确的速率和双工模式再跑一次小规模UDP测试比如-b 100M观察丢包情况排除物理链路问题然后跑TCP单流和并行流对比吞吐差异判断是TCP参数问题还是设备转发瓶颈。每一层的结果都是下一层的依据。比如UDP 100M不丢包但TCP单流只有300M那问题很可能在TCP窗口或CPU而不在链路物理层。这种思路能避免在网上盲查一通节省大量时间。7.2 一个实战案例千兆内网只有300Mbps前阵子有个同事找我说两台Windows服务器之间的网络很奇怪交换机显示端口是1Gbps全双工复制文件时速度勉强300Mbps怎么都上不去。我让他跑了一次iperf3 TCP默认测试结果确实只有320Mbps而且Retr不停涨。当时第一判断是物理链路有丢包结果用ping -f -l 1472测大包又正常。后来想到Windows自动调优的问题上去一看autotuninglevel果然被安全基线关掉了。恢复成normal之后再跑iperf3带宽直接到940Mbps重传也降到0。这个案例说明遇到Windows环境下的吞吐偏低不要第一时间怀疑硬件先把自己系统里的TCP参数查一遍。7.3 自动化定时采集和JSON输出iperf3带了-J参数可以把结果输出成JSON这让它的可编程性非常好。我在Windows上用PowerShell写过一个简单的定期巡检脚本大致逻辑是执行iperf3客户端命令把JSON输出保存到指定目录文件名带上日期时间然后输出关键字段汇总成一条记录。这样长期跑下来链路的变化趋势一目了然哪天突然变差翻记录就能看到具体哪一天开始衰落的。用计划任务每天夜里跑一次注意测试时间不能安排在业务高峰期UDP打流尤其要小心。脚本里建议加上超时控制Windows版iperf3有--connect-timeout参数可以设置防止服务端异常时脚本一直挂着。7.4 跨网段与穿防火墙的测试补充如果测试的链路中间有防火墙或安全设备通常需要放行5201端口的TCP和UDP有些设备还会拦高频率的UDP流量需要单独做策略。跨网段测试时先用ping确认基础连通性再跑iperf3否则又会出现“iperf3连不上但路由怪怪的”这种混合问题。有个小技巧在客户端加--get-server-output可以把服务端的统计拉到客户端一起展示。跨网段场景下两边网络视角不同同时看两端结果能更快判断问题是在发送端还是接收端。最后再说一点我的个人习惯我自己的习惯是在一台常驻的测试机上把iperf3服务端常开需要验证链路表现时从客户端跑一条固定的命令输出JSON存档。久而久之这些数据就形成了网络链路质量的历史记录排障时翻出来对比非常有用。如果你也常被网络问题缠住不妨从一次简单的iperf3测速开始把链路表现变成一串看得见的数据很多玄学问题一下子就落地了。