使用 Fortio 做代理功能测试
介绍
Fortio 是一个用于微服务性能负载、性能、延迟测试和 Web UI 的工具。它通常与 Istio 和其他服务网格解决方案一起使用,但可以独立使用来测试网络延迟和 HTTP/gRPC 的负载特性。以下是关于 Fortio 的一些主要特点和信息:
- 用途:Fortio 可以创建一个定制的负载(查询/秒或 qps)并记录请求延迟的直方图,以及每秒查询的百分位数。
- 多协议支持:虽然最初是为 HTTP/1.1 设计的,但 Fortio 还支持 HTTP/2, gRPC, TCP 和 UDP。
- Web UI:Fortio 提供了一个 Web 界面,使用户能够从浏览器中轻松配置测试并查看结果的直方图和百分位数。
- 结果存储:可以将结果存储为 JSON 文件,便于进一步的分析和比较。
- 灵活性:支持多种请求负载模式,包括固定 qps、固定并发连接数和最大自动调整 qps。
- 轻量级:Fortio 是用 Go 编写的,可以作为一个单一的二进制文件轻松部署。
- 集成:Fortio 可以与 Istio、Prometheus 等工具集成,以提供更深入的性能分析和观察。
Fortio 作为服务器
fortio server &
08:24:40.002 r1 [INF] scli.go:117> Starting, command="Φορτίο", version="1.59.0 h1:juuL/l3N/YyIP0P078YkkrtFfG4CaItqeZSkv5VnXCE= go1.20.7 arm64 darwin"
08:24:40.003 r1 Fortio 1.59.0 tcp-echo server listening on tcp [::]:8078
08:24:40.004 r1 Fortio 1.59.0 udp-echo server listening on udp [::]:8078
08:24:40.004 r1 Fortio 1.59.0 grpc 'ping' server listening on tcp [::]:8079
08:24:40.004 r1 Fortio 1.59.0 https redirector server listening on tcp [::]:8081
08:24:40.004 r1 Fortio 1.59.0 http-echo server listening on tcp [::]:8080
08:24:40.005 r1 Data directory is /Users/addo
08:24:40.005 r1 REST API on /fortio/rest/run, /fortio/rest/status, /fortio/rest/stop, /fortio/rest/dns
08:24:40.005 r1 Debug endpoint on /debug, Additional Echo on /debug/echo/, Flags on /fortio/flags, and Metrics on /debug/metrics
UI started - visit:
http://localhost:8080/fortio/
(or any host/ip reachable on this server)
08:24:40.005 r1 [INF] fortio_main.go:292> All fortio 1.59.0 h1:juuL/l3N/YyIP0P078YkkrtFfG4CaItqeZSkv5VnXCE= go1.20.7 arm64 darwin servers started!
Fortio 作为服务器运行是,默认会启动 8078
、8079
、8081
、8080
四个端口,分别是 tcp echo、udp echo、grpc ping 以及 http echo。还可以通过 http://localhost:8080/fortio/
访问内置的页面。
作为 HTTP Echo 服务器运行时,可以协议如下的请求参数。
参数 | 用法示例 |
---|---|
dely | 延迟响应的持续时间。可以是单个值或逗号分隔的概率列表,例如“delay=150us:10,2ms:5,0.5s:1”,表示 150 us 延迟的概率为 10%,2ms 延迟的 5% 和 1/2 秒延迟的 1% |
status | http 状态返回而不是 200。可以是单个值或逗号分隔的概率列表,例如“status=404:10,503:5,429:1”表示 404 状态的几率为 10%,503 状态的 5% 和 429 状态的 1% |
size | 要回复而不是回显输入的有效负载的大小。也可用作概率列表。‘size=1024:10,512:5’ 10% 的响应将为 1k,5% 将为 512 字节有效负载,其余部分默认为回显。 |
close | 在回答后关闭套接字,例如“close=true”表示在所有请求后关闭,或“close=5.3”在大约 5.3% 的请求后关闭 |
header | s 要添加到回复中的标头,例如 ‘&header=Foo:Bar&header=X:Y’ |
gzip | 如果“接受编码:gzip”由调用方/客户端在标头中传递; 而 ‘gzip=true’ 在查询参数中,所有响应都将被 gzip 压缩; 或者如果通过“gzip=42.7”,大约 42.7% 的人会 |
Fortio 作为负载生成器
例如以 10/s 速率、持续 30s 发送请求到 http://localhost:8080
。
fortio load -qps 10 -t 30s http://localhost:8080
更多 fortio load
的参数
Flag | Description, example |
---|---|
-qps rate |
所有连接/线程的每秒查询总数或 0 表示无等待/最大 qps |
-nocatchup |
不要试图在服务落后然后恢复时通过加快速度来达到目标 qps。使 QPS 成为绝对上限 即使服务有一些延迟峰值,fortio 也不会补偿(但也不会对目标施加超过设定的 qps 的压力)。建议与 -uniform . |
-c connections |
并行同时连接数(和匹配的 go 例程) |
-t duration |
运行测试多长时间(例如“-t 30m”运行 30 分钟)或运行 0 直到 ^C,考试 ple (default 5s) |
-n numcalls |
正好针对此数量的调用而不是持续时间运行。默认值 (0) 是使用持续时间 (-t)。 |
-payload str 或者 -payload-file fname |
切换到使用带有给定有效负载的 POST(另请参阅 -payload-size 了解随机有效负载) |
-uniform |
将调用及时分散到线程中,以实现更均匀的调用分配。 与 -nocatchup 结合使用效果更好。 |
-r resolution |
直方图最低存储桶的分辨率(以秒为单位)(默认为 0.001,即 1 毫秒),使用预期典型值的 1/10ical latency |
-H "header: value" |
可以多次指定添加标头(包括 Host:) |
-a |
根据标签和时间戳自动保存带有文件名的 JSON 结果 |
-json filename |
文件名或“-”用于 stdout 输出 json 结果(默认情况下相对于“-data-dir”,如果 want fortio report to show them; using -a is typicallly a better option) |
-labels "l1 l2 ..." |
要添加到生成的 JSON 中的其他配置数据/标签,默认为目标 URL 和主机名 |
-h2 |
客户端调用将尝试协商 http/2.0 而不是 http1.1,这意味着 -stdclient |
-X method |
将 http 方法更改为指定的方法,而不是基于 -payload-* 或者 -content-type |
-logger-force-color |
对于颜色而不是 JSON 输出的交互式运行 |
-logger-no-color |
即使从终端运行时也强制 JSON 输出 |
使用
比如做熔断功能的测试,需要对服务的延迟或者错误,以及出现概率进行调整。
fortio load -quiet -c 10 -n 100 -p 50,75,90,95,99 http://localhost:8080/echo\?status\=500:30
fortio load -quiet -c 10 -n 100 -p 50,75,90,95,99 http://localhost:8080/echo\?delay\=600ms:15