前言
话说,一年前项目响应时代的号召,引入了 Istio,从此如刘备得卧龙、凤雏,走上了 Service Mesh 的光辉大道。现到准备益州之战(上线)之时。上线前,还得评估一下性能变化。
为何要测试你的 Istio Mesh
现实世界,我们时常要回答一类问题:这个 Istio Mesh 基础平台的性能如何,TPS 容量怎样? Latency 怎样? 只有得出实际环境 Istio Mesh 性能基线,才可能回答。且基线的测量要排除应用程序业务实现的影响。
它山之石 - Fortio(Φορτίο)
Istio 这艏大船🚢(是的,已经不是当然LOGO中的小舤船⛵了)有其 benchmark 报告:https://istio.io/latest/docs/ops/deployment/performance-and-scalability/ 。报告说,benchmark 用的工具有:
- fortio (https://fortio.org/)
- blueperf - 一个现实世界航空使用的 Cloud native 微服务集,用于测试
- isotope - 配置化生成服务、服务拓扑的工具
本文先看 fortio。 Fortio 是什么鬼?它是一个针对 HTTP/grpc 流量,做 benchmark/load test 的工具。特别适用于 benchmark 7层代理(http代理)与其下运行的网络环境。说到网络应用的测试,主要的参与方无非就是 client side
与 server side
。而不同的 Fortio 实例可以选择作为 client side
或 server side
。即 Fortio 可以选择两种不同角色。
测试条件与指标
在介绍 Fortio 之,还得了解一些相关的知识。
测试条件
所有的性能测试,都强依赖于测试条件。 Benchmark 也不例外。本文的 proxy 测试中(本例为 HTTP/1.1 keep-alive),有以下主要条件:
Client Side:
- Client side 线程数/Client side TCP 连接数
- Request 包大小
- QPS 目标。这影响到 client thread think time
Server Side:
- 服务本身的 latency
- Response 包大小
指标
现实中的所谓 Cloud native 可观察,有时面对的问题不是指标类型太小,而在太多🤣。Benchmark 时,选择合理的指标是 Benchmark 报告有意义的关键。一般,我会关注以下指标:
- 实际 QPS
- 实际 Latency,以百份位统计,而非平均值
Fortio 出场
Fortio 架构
从顶层看,就只有 Client 和 Server 了。而 Client 和 Server 也是可以用其它工具代替的,即,你可以只使用它的 client 功能或 server 功能。如果你关注性能测试领域,你可能会用 wrk/nighthawk 作为 client,或 nighthawk/httpbin 作为 server。
Fortio 的测试条件
Fortio Client/Server 最少分别支持以下配置项:
Fortio 的测试报告
例子报告如上图。报告出自 Client side 的 Fortio。其中包含在各个百份位(包括中位,p50)下的 Latency,实际的QPS 。上图只是报告的一部分,很多明细信息没在图中。
Fortio 的配置方法
首先看配置界面中 Client side 用到的部分:
说明一下重要字段:
- URL - server 的 URL。详细后文说明
- QPS - 期望的 QPS,client side 根据这个来给压力
- Duration - 测试时长
- Threads/Simulateous connections - 线程数和连接数。是的,keep-alive http/1.1
- Jitter - Client side 是否启用抖动流量算法,Istio 官方的 benchmark report 中说,启动后 latency 会减少。我没亲测。
- Payload - HTTP POST 的 body,不同大小的body,性能表现不同
- Timeout - client side 的 timeout
重点说一下 URL。上面的 URL 中的参数用于控制 server side 的行为。是的,你没看错,可以为 client side 的 URL 参数控制 server side 的行为。事实上, server side 的参数可以在 server side 的参数可以在启动 server side 进程时,以命令参数的方式指定。但 client side URL 中指定更灵活。如:
http://fortio-server-l2:8080/echo?delay=150us:10,2ms:5,0.5s:1&status=404:10,503:5,429:1
参数 | 例子 | 说明 |
---|---|---|
delay | delay=150us:10,2ms:5,0.5s:1 | 服务端 delay,10% 流量是 150us,5% 流量是 2ms,1% 流量是 0.5 s,其它没 delay |
status | status=404:10,503:5,429:1 | 服务端 HTTP status,10% 流量是 404,5%是503,1%是429。其它 200。 |
size | Response 的大小 |
定制服务拓扑
现实的环境中,服务间的调用,是拓扑关系。不然怎么叫 mesh。于是,benchmark 也可以是基于拓扑关系的:
fortio sever 通过命令行可以建立一个转发拓扑,如上图中的 Fortio(Level 1)用以下命令参数启动:
|
|
结语
本文不是个完整的 fortio 介绍。完整的介绍还是看官网 fortio (https://fortio.org/) 。和其它类似的工具比较有其优点:
- 是 Istio 官方御用
- golang 的实现,传说中的高性能(虽然我一直认为这个论调太 naive)
- URL 中指定 latency 和 http status code
- 可定制拓扑关系
当需要知道我们自己的 Istio Mesh 的性能时,benchmark 是一个很好的方法(之一)。
Keep Benchmarking, Keep Sweeping !