
跨平台 CLI,用于通过 TCP、UDP、HTTP、HTTPS 和 ICMP 进行网络性能测试:带宽、连接数/秒、包数/秒、延迟、丢包、抖动、ping 和 traceroute。
Ethr 是一款使用 golang 编写的跨平台网络性能测量工具。该项目的目标是提供一个原生的工具,用于跨多种协议(如 TCP、UDP、HTTP、HTTPS)和跨多个平台(如 Windows、Linux 和其他 Unix 系统)进行全面的网络性能测量,包括带宽、连接数/秒、数据包数/秒、延迟、丢包和抖动。
Ethr 借鉴了现有开源网络性能工具的思想,并在此基础上进行了扩展。在带宽测量方面,它类似于 iPerf3,用于 TCP 和 UDP 流量。iPerf3 拥有更多选项,例如限速测试、更丰富的功能集,而 Ethr 支持多线程,可扩展到 1024 甚至更高数量的连接、多个客户端与单个服务器通信等。在延迟测量方面,它类似于 Windows 上的 latte 或 Linux 上的 sockperf。
与其他工具相比,Ethr 提供了更多的测试测量项,例如它可以在单个工具中提供带宽、连接数/秒、数据包数/秒、延迟以及 TCP 连接建立延迟的测量。未来,计划添加更多功能(希望其他人能够贡献)以及更多协议支持,使其成为全面的网络性能测量工具。
得益于 golang,Ethr 天生就是跨平台的,这不像通过 cygwin 等抽象层编译那样可能会限制功能。它希望通过结合 iPerf3、ntttcp、psping、sockperf 和 latte 等工具的功能,提供一个跨多个平台、支持多种协议的单一工具,从而统一性能测量。
https://github.com/Microsoft/ethr/releases/latest
Linux
wget https://github.com/microsoft/ethr/releases/latest/download/ethr_linux.zip
unzip ethr_linux.zip
Windows Powershell
wget https://github.com/microsoft/ethr/releases/latest/download/ethr_windows.zip -OutFile ethr_windows.zip
Expand-Archive .\ethr_windows.zip -DestinationPath .
OSX
wget https://github.com/microsoft/ethr/releases/latest/download/ethr_osx.zip
unzip ethr_osx.zip
注意:从源码构建需要 go 1.11 或更高版本。
我们使用 go-module 来管理 Ethr 的依赖。更多信息请查看 如何使用 go-modules!
git clone https://github.com/Microsoft/ethr.git
cd ethr
go build
如果 ethr 被克隆到 $GOPATH/src 目录树中,请确保使用 GO111MODULE=on 来调用 go 命令!
使用以下命令构建镜像:
docker build -t microsoft/ethr .
生成二进制文件:
Linux
docker run -e GOOS=linux -v $(pwd):/out microsoft/ethr make build-docker
Windows
docker run -e BINARY_NAME=ethr.exe -e GOOS=windows -v $(pwd):/out microsoft/ethr make build-docker
OS X
docker run -e BINARY_NAME=ethr -e GOOS=darwin -v $(pwd):/out microsoft/ethr make build-docker
go get github.com/microsoft/ethr
假设你正在使用 yay (https://github.com/Jguer/yay):
yay -S ethr
请按照“从源码构建”主题构建 ethr.exe
修改 ethr.nuspec 以添加新的发布版本
vim ethr.nuspec
创建 nuget 包(如 Ethr.0.2.1.nupkg)
nuget.exe pack ethr.nuspec
将包上传到 nuget.org。
帮助:
ethr -h
服务器:
ethr -s
带文本用户界面的服务器:
ethr -s -ui
客户端:
ethr -c <server ip>
示例:
// 启动服务器
ethr -s
// 使用 1 个线程启动默认(带宽)测试测量的客户端
ethr -c localhost
// 使用 8 个线程启动带宽测试
ethr -c localhost -n 8
// 使用 64 个线程向服务器 10.1.0.11 启动连接数/秒测试
ethr -c 10.1.0.11 -t c -n 64
// 在端口 9999 上运行 Ethr 服务器
./ethr -s -port 9999
// 测量到端口 9999 上 Ethr 服务器的 TCP 连接建立延迟
// 假设 Ethr 服务器运行在 IP 地址为 10.1.1.100 的服务器上
./ethr -c 10.1.1.100 -p tcp -t pi -d 0 -4 -port 9999
// 测量到 www.github.com 端口 443 的 TCP 连接建立延迟
./ethr -x www.github.com:443 -p tcp -t pi -d 0 -4
// 测量到 www.github.com 端口 443 的 TCP 连接建立延迟
// 注意:此处端口 443 由 https 自动推导
./ethr -x https://www.github.com -p tcp -t pi -d 0 -4
// 测量到 www.github.com 的 ICMP ping 延迟
sudo ./ethr -x www.github.com -p icmp -t pi -d 0 -4
// 运行类似 Linux 上 mtr 的测量
sudo ./ethr -x www.github.com -p icmp -t mtr -d 0 -4
// 通过发送 1 字节小数据包来测量 UDP 数据包数/秒
./ethr -c 172.28.192.1 -p udp -t p -d 0
对于 ICMP 相关测试(Ping、TraceRoute、MyTraceRoute),Windows 要求通过防火墙允许 ICMP。可以使用 PowerShell 中的以下命令完成此操作。但是,仅在设置的安全策略允许的情况下使用。
// 通过防火墙允许 IPv4 的 ICMP 数据包
New-NetFirewallRule -DisplayName "ICMP_Allow_Any" -Direction Inbound -Protocol ICMPv4 -IcmpType Any -Action Allow -Profile Any -RemotePort Any
// 通过防火墙允许 IPv6 的 ICMP 数据包
New-NetFirewallRule -DisplayName "ICMPV6_Allow_Any" -Direction Inbound -Protocol ICMPv6 -IcmpType Any -Action Allow -Profile Any -RemotePort Any
此外,对于基于 TCP 的 TraceRoute 和 MyTraceRoute,需要管理员模式,否则 Ethr 将无法接收 ICMP TTL 超时消息。
对于 ICMP Ping、ICMP/TCP TraceRoute 和 MyTraceRoute,需要通过 sudo 使用特权模式。
-h
帮助
-no
禁用日志文件记录。默认启用日志文件记录。
-o <filename>
日志文件名。默认使用以下文件名:
服务器模式:'ethrs.log'
客户端模式:'ethrc.log'
-debug
在日志输出中启用调试信息。
-4
仅使用 IP v4 版本
-6
仅使用 IP v6 版本
在此模式下,Ethr 作为服务器运行,允许多个客户端针对其运行性能测试。
-s
以服务器模式运行。
-ip <string>
绑定到指定的本地 IP 地址以进行 TCP 和 UDP 测试。
这必须是有效的 IPv4 或 IPv6 地址。
默认值:<空> - 任意 IP
-port <number>
使用指定的端口号进行 TCP 和 UDP 测试。
默认值:8888
-ui
在文本界面中显示输出。
在此模式下,Ethr 客户端只能与 Ethr 服务器通信。
-c <server>
以客户端模式运行并连接到 <server>。
服务器使用名称、FQDN 或 IP 地址指定。
-b <rate>
仅传输每秒比特数(格式:<num>[K | M | G])
仅适用于带宽测试。默认值:0 - 不限
示例:100(100bits/s),1M(1Mbits/s)。
-cport <number>
在客户端使用指定的本地端口号进行 TCP 和 UDP 测试。
默认值:0 - 临时端口
-d <duration>
测试持续时间(格式:<num>[ms | s | m | h]
0:永远运行
默认值:10s
-g <gap>
连续测量之间的时间间隔(格式:<num>[ms | s | m | h]
仅适用于延迟、ping 和 traceRoute 测试。
0:无间隔
默认值:1s
-i <iterations>
每次延迟测量的往返迭代次数。
仅适用于延迟测试。
默认值:1000
-ip <string>
绑定到指定的本地 IP 地址以进行 TCP 和 UDP 测试。
这必须是有效的 IPv4 或 IPv6 地址。
默认值:<空> - 任意 IP
-l <length>
要使用的缓冲区长度(格式:<num>[KB | MB | GB])
仅适用于带宽测试。最大 1GB。
默认值:16KB
-n <number>
并行会话(和线程)数量。
0:等于 CPU 数量
默认值:1
-p <protocol>
协议("tcp"、"udp"、"http"、"https" 或 "icmp")
默认值:tcp
-port <number>
使用指定的端口号进行 TCP 和 UDP 测试。
默认值:8888
-r
对于带宽测试,从服务器向客户端发送数据。
-t <test>
要运行的测试("b"、"c"、"p"、"l"、"cl" 或 "tr")
b:带宽
c:连接数/秒
p:数据包数/秒
l:延迟、丢包和抖动
pi:Ping 丢包和延迟
tr:TraceRoute
mtr:MyTraceRoute,包含丢包和延迟
默认值:b - 带宽测量。
-tos
指定要在 IPv4 TOS 字段或 IPv6 流量类别字段中使用的 8 位值。
-w <number>
使用指定的迭代次数进行预热。
默认值:1
-T <string>
在日志文件中使用给定的标题记录结果。
默认值:<空>
在此模式下,Ethr 与非 Ethr 服务器通信。此模式仅支持少数几种测量类型,
例如 Ping、连接数/秒和 TraceRoute。
-x <destination>
以外部客户端模式运行并连接到 <destination>。
<destination> 以 URL 或 Host:Port 格式指定。
对于 URL,如果未指定端口,则 http 假定为 80,https 假定为 443。
示例:对于 TCP - www.microsoft.com:443 或 10.1.0.4:22 或 https://www.github.com
对于 ICMP - www.microsoft.com 或 10.1.0.4
-cport <number>
在客户端使用指定的本地端口号进行 TCP 和 UDP 测试。
默认值:0 - 临时端口
-d <duration>
测试持续时间(格式:<num>[ms | s | m | h]
0:永远运行
默认值:10s
-g <gap>
连续测量之间的时间间隔(格式:<num>[ms | s | m | h]
仅适用于延迟、ping 和 traceRoute 测试。
0:无间隔
默认值:1s
-ip <string>
绑定到指定的本地 IP 地址以进行 TCP 和 UDP 测试。
这必须是有效的 IPv4 或 IPv6 地址。
默认值:<空> - 任意 IP
-n <number>
并行会话(和线程)数量。
0:等于 CPU 数量
默认值:1
-p <protocol>
协议("tcp" 或 "icmp")
默认值:tcp
-t <test>
要运行的测试("c"、"cl" 或 "tr")
c:连接数/秒
pi:Ping 丢包和延迟
tr:TraceRoute
mtr:MyTraceRoute,包含丢包和延迟
默认值:pi - Ping 丢包和延迟。
-tos
指定要在 IPv4 TOS 字段或 IPv6 流量类别字段中使用的 8 位值。
-w <number>
使用指定的迭代次数进行预热。
默认值:1
-T <string>
在日志文件中使用给定的标题记录结果。
默认值:<空>
Windows
已测试:Windows 10、Windows 7 SP1
未测试:其他 Windows 版本
Linux
已测试:Ubuntu Linux 18.04.1 LTS、OpenSuse Leap 15
未测试:其他 Linux 版本
OSX
已测试:OSX 由贡献者测试
其他
目前未测试其他平台
待办事项工作项如下所示。非常欢迎为这些工作项或任何其他功能和错误修复做出贡献。
本项目欢迎贡献和建议。大多数贡献需要您同意一份贡献者许可协议(CLA),声明您有权且确实授予我们使用您贡献的权利。详情请访问 https://cla.microsoft.com。
当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA,并适当装饰 PR(例如,标签、评论)。只需按照机器人提供的说明操作即可。在使用我们 CLA 的所有仓库中,您只需执行一次此操作。
本项目采用了 Microsoft 开放源代码行为准则。 有关更多信息,请参阅 行为准则常见问题解答 或通过 [email protected] 联系,提出任何其他问题或评论。
| 协议 | 带宽 | 连接数/秒 | 数据包数/秒 | 延迟 | Ping | TraceRoute | MyTraceRoute |
|---|
| TCP | 是 | 是 | 不适用 | 是 | 是 | 是 | 是 |
| UDP | 是 | 不适用 | 是 | 否 | 不适用 | 否 | 否 |
| ICMP | 否 | 不适用 | 不适用 | 不适用 | 是 | 是 | 是 |