简介:jperf-1.0.0.zip 是面向 Linux 运维与网络性能测试人员的 Java 版网络性能评估工具包,基于 iperf 图形化封装,可解决带宽、延迟、丢包率等关键指标的测量与调优问题,适合具备一定网络基础的工程师上手使用。压缩包共 49 个文件,以 20 个 java 源码与 14 个 class 字节码为主体,辅以 5 个 xml 配置、3 个 txt 说明文档及 iml、iws、ipr 等 IDE 工程文件,另含 jar 包与 properties 配置,整体约 70KB,结构完整便于二次编译与源码研读。目前已有 106 人学习下载。资源涵盖 TCP_RR、TCP_CBR、UDP_RR 等多种测试模式,读者可借此掌握并发连接模拟、参数精细化配置及与 iperf 命令行集成的思路,适用于网络设备性能验证、数据中心优化与云服务性能测试等场景,是 Linux 环境下开展网络性能测试的实用参考。
1. jperf-1.0.0.zip 在 Linux 上到底能干什么:先搞清楚它和 iperf 的关系
很多人第一次拿到jperf-1.0.0.zip会以为这是个独立的压测工具,解压完发现里面全是.java、.iml、.ipr和build.xml,一脸懵。其实 jperf 本质上是 iperf 命令行工具的 Java 图形前端,它自己不实现 TCP/UDP 打流逻辑,真正发包收包的是底层 iperf 可执行文件。所以你在 Linux 上跑 jperf,前提是系统里得有 iperf 或 iperf3,否则界面能打开但一跑测试就报连接失败。
这份 1.0.0 版本是典型的 Java 桌面工程结构:src放源码,examples放示例,pom.xml和build.xml分别对应 Maven 和 Ant 两套构建方式,jperf-all.iml、jperf-all.ipr、jperf-all.iws是 IntelliJ IDEA 的工程文件。它解决的核心问题是:把 iperf 那一堆-c、-u、-b、-P、-t参数变成可视化表单,让你不用背命令也能做带宽、延迟、丢包率测试。适合网络运维、服务器性能调优、机房验收这类需要反复跑参数组合的人,也适合刚接触 Linux 网络测试、想先看图形结果再学命令行的新手。
2. 环境准备与构建:从 zip 到能跑的 jperf
2.1 先确认 Java 和 iperf 两个依赖
jperf 是 Java 写的,所以 JRE 必须有。Ubuntu/Debian 系用sudo apt-get install default-jdk,CentOS/RHEL 系用yum install java-1.8.0-openjdk。装完用java -version确认能输出版本号。这里有个血泪经验:jperf 1.0.0 年代较早,用 JDK 17 以上有时会碰到 Swing 界面渲染异常,稳妥做法是装 JDK 8 或 11。
iperf 本身在多数发行版仓库里就有,sudo apt-get install iperf或yum install iperf即可。装完执行iperf -v,记住版本号,因为 jperf 调 iperf 时参数格式跟版本有关,iperf2 和 iperf3 的参数并不完全兼容。
# 检查两个依赖是否就位 java -version iperf -v # 如果 iperf 没装,按发行版选一条 sudo apt-get install iperf # Debian/Ubuntu sudo yum install iperf # CentOS/RHEL逻辑说明:java -version验证 JRE,iperf -v验证打流工具。参数说明:这里不需要额外参数,只要命令能正常返回版本信息就说明环境通了。如果iperf -v报 command not found,先解决安装再往下走,否则后面 jperf 一定跑不起来。
2.2 解压并看懂目录结构
拿到jperf-1.0.0.zip后,先解压到工作目录。压缩包里除了源码,还有target目录,里面通常放着已经编译好的 jar 或 class,运气好的话不用自己编译就能直接跑。
unzip jperf-1.0.0.zip -d jperf-1.0.0 cd jperf-1.0.0 ls -la逻辑说明:-d指定解压目录,避免文件散落当前目录。解压后你会看到src、examples、pom.xml、build.xml、README.txt、LICENSE.txt这些。README.txt一定要先读,里面往往写了启动方式和依赖版本。参数说明:ls -la用来确认隐藏文件(比如._README.txt这种 macOS 元数据文件)也在,这些文件在 Linux 上没用,可以忽略。
2.3 用 Maven 或 Ant 构建
工程里同时给了pom.xml和build.xml,说明作者支持两种构建方式。优先用 Maven,因为依赖管理更省心。
# 方式一:Maven 构建 mvn clean package # 方式二:如果没装 Maven,用 Ant ant -f build.xml逻辑说明:mvn clean package会清理旧产物、拉依赖、编译、打包,最终在target下生成可执行 jar。参数说明:clean清掉上次构建残留,package触发打包生命周期。如果公司内网拉不到 Maven 中央仓库,会卡在下载依赖,这时改用 Ant 更稳,因为build.xml通常只依赖本地已有的库。构建成功后去target目录找 jar 文件,用java -jar启动。
3. 跑通第一次测试:TCP 和 UDP 两种模式怎么配
3.1 服务端与客户端的启动顺序
jperf 的测试模型是经典的一服务端多客户端。服务端先起,监听端口;客户端再连,发起打流。顺序反了会直接报连接拒绝,这是新手最常见的翻车点。
# 服务端机器(假设 IP 是 192.168.1.10) iperf -s -p 5001 # 客户端机器 iperf -c 192.168.1.10 -p 5001 -t 30逻辑说明:服务端-s表示 server 模式,-p指定端口。客户端-c指定服务端地址,-t 30表示测试持续 30 秒。参数说明:端口默认 5001,如果被占用可以换 5002 等。jperf 图形界面里这些字段都有对应输入框,本质就是帮你拼这条命令。先在命令行确认能跑通,再用 jperf 图形界面,排错会快很多。
3.2 TCP 模式:看带宽和重传
TCP 测试关注的是吞吐量和重传次数。jperf 里选 TCP 模式后,重点配三个参数:并发连接数、测试时长、TCP 窗口大小。
# 多并发 TCP 测试,8 条流,跑 60 秒 iperf -c 192.168.1.10 -p 5001 -t 60 -P 8 -w 256K逻辑说明:-P 8开 8 条并发连接,用来压服务器处理多连接的能力;-w 256K设置 TCP 窗口,窗口太小会限制单流带宽,太大在丢包链路上反而容易触发重传。参数说明:窗口值要根据链路 BDP(带宽时延积)估算,千兆内网 256K 通常够用,跨广域网可能要调到 1M 以上。jperf 结果区会显示总带宽和每条流的带宽,如果各流差异很大,说明负载不均,要查网卡多队列或交换机哈希策略。
3.3 UDP 模式:测丢包和抖动
UDP 测试必须显式指定带宽,否则默认速率极低,测出来没意义。这是 UDP 模式和 TCP 模式最大的操作差异。
# UDP 测试,目标带宽 100Mbps iperf -c 192.168.1.10 -p 5001 -u -b 100M -t 60逻辑说明:-u切到 UDP,-b 100M指定发送速率。参数说明:-b可以写100M、1G这种带单位的值。jperf 结果里重点看丢包率和抖动(jitter),丢包率超过 1% 在实时音视频场景就算不合格。如果丢包严重,先降带宽再测,逐步逼近链路真实上限,别一上来就拉满。
提示:UDP 测试前先确认服务端和客户端之间的防火墙放行了对应端口,UDP 被拦时现象是客户端一直发、服务端收不到,结果里丢包率接近 100%。
4. 参数调优与结果解读:别只看一个带宽数字
4.1 并发连接数和带宽的对应关系
很多人以为并发数越高带宽越大,实际不一定。单条 TCP 流受窗口和 RTT 限制,带宽有上限;开多条流能叠加,但叠加到链路饱和后就不再涨。jperf 里可以固定时长、逐步增加-P值,观察总带宽曲线什么时候走平,那个拐点就是链路实际能承载的并发能力。
| 并发数 | 总带宽 | 单流带宽 | 判断 |
|---|---|---|---|
| 1 | 300 Mbps | 300 Mbps | 单流受限 |
| 4 | 900 Mbps | 225 Mbps | 接近千兆 |
| 8 | 940 Mbps | 118 Mbps | 已饱和 |
| 16 | 945 Mbps | 59 Mbps | 无增益 |
这张表是典型千兆内网的表现。看到 8 条流以后总带宽不再涨,说明链路打满了,再加并发只会让单流更慢。参数说明:测试时每档至少跑 30 秒,太短会被 TCP 慢启动干扰,结果偏低。
4.2 结果里的重传和丢包怎么读
TCP 模式结果里有个 Retr(重传)列,UDP 模式有 Lost/Total 和 Jitter。重传高说明链路有丢包或拥塞,但重传低不代表链路好,也可能是窗口太小没压满。判断逻辑是:先看带宽有没有达到预期,再看重传率。千兆内网重传率应该在 0.1% 以下,超过 1% 就要查网线、光模块或交换机端口错误计数。
# 在测试同时看网卡错误计数 ip -s link show eth0逻辑说明:ip -s link输出网卡的收发包和错误统计。参数说明:重点看 RX/TX errors 和 dropped 两列,测试前后各看一次,差值大说明物理层或驱动层有问题,这时候再怎么调 jperf 参数都没用,得先修链路。
4.3 把 jperf 结果导出做对比
jperf 支持把结果导出成文本,方便做升级前后对比。常见做法是:网络调整前跑一轮基线,调整后再跑一轮,两轮参数完全一致,只对比带宽和重传。参数说明:导出时记得把测试时长、并发数、窗口大小一起记下来,否则两轮数据没有可比性。我一般会在文件名里带上日期和参数,比如jperf_20240101_tcp_p8_w256k.txt,回头翻记录一眼就能对上。
5. 避坑与排查:jperf 跑不起来时先查这几条
5.1 界面能开但测试报连接失败
现象:jperf 图形界面正常启动,点开始后立刻提示连接被拒绝或超时。原因通常是服务端 iperf 没起,或者端口被防火墙拦了。解决:先在服务端手动执行iperf -s -p 5001,确认监听正常,再用telnet 服务端IP 5001从客户端测端口通不通。TCP 端口通了再测 UDP,UDP 没有连接概念,只能靠服务端是否收到包判断。
5.2 带宽远低于预期
现象:千兆链路只测出几十兆。原因可能是单流窗口太小、RTT 太大,或者测试时长太短被慢启动拖累。解决:先加并发-P,再把-w窗口调大,测试时长拉到 30 秒以上。如果还是不涨,用ethtool eth0看网卡协商速率是不是掉到百兆了,这种物理层问题在机房很常见。
5.3 UDP 丢包率异常高
现象:UDP 测试丢包 50% 以上。原因多半是发送带宽超过了链路实际能力,或者中间设备对 UDP 做了限速。解决:从低带宽开始逐步往上加,找到丢包开始明显上升的临界点,那个值才是链路对 UDP 的真实承载上限。别直接拿-b 1G去压百兆链路,结果一定是满屏丢包。
5.4 构建时依赖下载失败
现象:mvn clean package卡在下载依赖,最后报错。原因:内网访问不了 Maven 中央仓库,或者代理配置不对。解决:改用ant -f build.xml走本地构建,或者把pom.xml里的仓库地址换成公司内网镜像。如果target目录里已经有编译好的 jar,直接拿来用,跳过构建这一步。
5.5 图形界面中文乱码
现象:jperf 界面上的中文显示成方块。原因:JRE 缺少中文字体,或者启动时没指定编码。解决:安装中文字体包(如fonts-noto-cjk),启动时加-Dfile.encoding=UTF-8。参数说明:这个参数要加在java命令和-jar之间,写成java -Dfile.encoding=UTF-8 -jar jperf.jar。
6. 进阶技巧:把 jperf 当 iperf 参数试验台
jperf 最大的价值其实不是图形界面本身,而是它能帮你快速试出合适的 iperf 参数组合,然后把这套参数固化到脚本里,以后批量测试就不用再开界面了。我的习惯是:先在 jperf 里调出满意的并发数、窗口、时长,把对应的命令行抄下来,写成一个 shell 脚本,配合for循环跑多轮,结果统一重定向到文件。
#!/bin/bash # 批量跑不同并发数,结果按并发数命名 SERVER="192.168.1.10" PORT=5001 DURATION=30 for P in 1 2 4 8 16; do echo "=== concurrency: $P ===" iperf -c $SERVER -p $PORT -t $DURATION -P $P -w 256K \ > "result_tcp_p${P}.txt" 2>&1 sleep 5 # 每轮之间留间隔,避免上一轮残留连接干扰 done逻辑说明:循环变量P依次取不同并发数,每轮结果单独存文件。参数说明:sleep 5是给 TCP 连接留出 TIME_WAIT 回收时间,不加的话下一轮可能因为端口占用报错。跑完用grep提取每轮的带宽行做对比:
grep -H "sender" result_tcp_p*.txt这样一轮下来,链路在不同并发下的表现一目了然,比在图形界面里一次次手点快得多。验证方法也简单:把脚本跑出的数据和 jperf 界面里同参数的结果对一下,数值应该基本一致,差太多说明脚本里的参数抄错了。
还有个容易被忽略的点:jperf 1.0.0 的examples目录里有示例配置,值得翻一翻,里面往往有作者推荐的参数组合。另外LICENSE.txt要看一下,确认授权方式再决定能不能用在公司项目里。从那以后我每次拿到这类 Java 老工程,都强制先读README.txt和examples,再动手构建,能省掉大量瞎试的时间。希望帮到你。
本文还有配套的精品资源,点击获取