#作者: 西门吹雪
文章目录
- Fortio 安装
- docker 安装:
- MacOS安装:
- linux安装:
- 对于http负载生成最重要的标志:
- Fortio server 功能
- TCP
- UDP
- gRPC
- 负载测试
- gRPC 负载测试
- 在k8s或者容器中使用fortio进行压测
- fortio 直接在docker中作为sidecar使用
Fortio是一个微服务(http,grpc)负载测试库,命令行工具,高级 echo 服务器,以及go(golang)的web UI。Fortio允许指定一组每秒查询的负载,并记录延迟直方图和其他有用的统计数据。
Fortio以指定的每秒查询次数(qps)运行,记录执行时间的柱状图,并计算百分比(例如,p99即响应时间,如99%的请求耗时少于该数字(秒,SI单位))。它可以运行一个设定的时间,固定的调用次数,或直到中断(在一个恒定的目标QPS,或每个连接/线程的最大速度/负载)。
Fortio还包括一组服务器端的功能(类似于httpbin),以帮助调试和测试:请求echo,包括头文件,添加延迟或错误代码的概率分布,tcp echo,tcp代理,http fan out/ scatter
和收集代理服务器,HTTP 之外的 GRPC echo/健康等等。
Fortio 安装
docker 安装:
> docker run -p 8080:8080 -p 8079:8079 fortio/fortio server &
> docker run fortio/fortio load http://www.baidu.com/
MacOS安装:
brew install fortio
linux安装:
> curl -L https://github.com/fortio/fortio/releases/download/v1.37.1/fortio-linux_amd64-1.37.1.tgz \| sudo tar -C / -xvzpf -
# or the debian package> wget https://github.com/fortio/fortio/releases/download/v1.37.1/fortio_1.37.1_amd64.deb
dpkg -i fortio_1.37.1_amd64.deb
# or the rpm> rpm -i https://github.com/fortio/fortio/releases/download/v1.37.1/fortio-1.37.1-1.x86_64.rpm
# and more, see assets in release page
对于http负载生成最重要的标志:
Fortio server 功能
echo 服务器,它将回传发布的数据:
常用的压测:
fortio server -echo-server-default-params="delay=0.5s:50,1s:40&status=418"
过在 server 命令行中传递 -echo-server-default-params
来设置所有这些的默认值.
将使服务器响应http 418,一半时间的延迟为0.5s,40%为1s,10%的呼叫没有延迟。
除此之外fortio的UI功能:
- 运行或者触发测试并绘制结果图。
- 浏览保存的结果的用户界面图或多图(最小、平均、中位数、p、p99、p99.9和最大值的比较图)。
- 代理或者获取其他URL
/fortio/data/inx.tsv
一个符合谷存储URL列表数据传输格式的tab分离值文件,所以你可以导出或者备份本地结 果到云端。- 从其他Fortio服务器下载或者同步点对点的JSON结果文件用他们的index.tsv URL)。
从运行的服务器上触发和取消运行的API(就像form ui,但更直接,并且有 async=on 选项)。
/fortio/rest/run
启动 run;参数可以来自命令行,也可以来自POST的JSON;可以提供 jsonPath 来寻找json对象的子集,例如 jsonPath=metadata 允许使用flagger webhook元数据作为fortio运行参数(见下面远程触发的负载测试部分)。
/fortio/rest/stop
停止所有当前运行或按运行ID停止。
我们可以启动下fortio server的UI界面:
fortio server &
可以看到对应的界面:
对端口进行改变:
目前对fortio使用压测这块主要是根据几个方面:
- TCP
- UDP
- GRPC
- loaderunner
- k8s docker lo
TCP
独启动 echo-server
并运行一个负载(使用 tcp:// 前缀试是针对tcp echo server的)。
启动客户端:
UDP
单独启动 udp-echo 服务器并运行负载(使用tcp://前缀来进行负载测试,用于tcp echo服务器)。
客户端测试一下:
gRPC
grpc ping 测试:
变换grpc目标端口:
在 grpc ping时候指定一个主机名或IP地址时,可以使用 -grpc-port 的值(默认为8079)。在 grpcping 的目标中添加 :port 来改变这种行为。
启动 grpc echo server,通过 -grpc-port 8018 指定 grpc echo 端口 :
测试,通过在地址后面增加 :8018 来指定端口:
负载测试
gRPC 负载测试
使用 -s 来使用每个连接(-c)的多个(http2/grpc)流,请求击中fortio ping grpc` 端点,回复延迟 0.5s,并有10字节的额外有效载荷,自动保存json结果。
在k8s或者容器中使用fortio进行压测
在k8s上部署下 fortio-server ,http 服务暴露在了容器内的8080端口。 同时也创建了同名的 fortio-server Kubernetes 服务。
fortio server 启动后,可以看到如下的输出:
在client实现测试:
这里需要注意下,注意 annotations 中的 proxy.istio.io/config: ‘{ “holdApplicationUntilProxyStarts”: true }’。
这个配置用于确保 fortio client 在 istio sidecar启动之后,再执行。 否则,fortio client 会无法连接网络直接报错。
如果你没有安装 service mesh,就不需要添加这个 annotation,直接false就可以。
这里的命令行参数 -t 1m表示测试1分钟,由于 Kubernetes Job 的限制,我们只能使用定时长的方式执行测试.
输出如下:
这是通常情况下我们使用k8s去进行压测的过程,但是如果我们只是希望压测某一个容器的话,我们也可以自己创建一个基于ubuntu的容器通过:
然后在ubantu中直接进行对应的对象的压测.
fortio 直接在docker中作为sidecar使用
Docker 安装Fortio
然后可以开启docker fortio的服务端:
docker run --rm -i -p 8080:8080 fortio/fortio server
启动后访问 http://127.0.0.1:8080/fortio 通过ui操作即可。
也可以直接启动:
docker run -p 8080:8080 -p 8079:8079 fortio/fortio server & docker run -p 8080:8080 -p 8079:8079 fortio/fortio server &
然后当作sidecar开始进行压测: