Please enable Javascript to view the contents

你的 Istio Mesh 性能及格吗?

 ·  ☕ 4 分钟

image-20210601224250230

前言

话说,一年前项目响应时代的号召,引入了 Istio,从此如刘备得卧龙、凤雏,走上了 Service Mesh 的光辉大道。现到准备益州之战(上线)之时。上线前,还得评估一下性能变化。

为何要测试你的 Istio Mesh

现实世界,我们时常要回答一类问题:这个 Istio Mesh 基础平台的性能如何,TPS 容量怎样? Latency 怎样? 只有得出实际环境 Istio Mesh 性能基线,才可能回答。且基线的测量要排除应用程序业务实现的影响。

它山之石 - Fortio(Φορτίο)

image-20210603091306991

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 sideserver side。而不同的 Fortio 实例可以选择作为 client sideserver 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 架构

image-20210603094355918

从顶层看,就只有 Client 和 Server 了。而 Client 和 Server 也是可以用其它工具代替的,即,你可以只使用它的 client 功能或 server 功能。如果你关注性能测试领域,你可能会用 wrk/nighthawk 作为 client,或 nighthawk/httpbin 作为 server。

Fortio 的测试条件

Fortio Client/Server 最少分别支持以下配置项:

image-20210603100005357

Fortio 的测试报告

report

例子报告如上图。报告出自 Client side 的 Fortio。其中包含在各个百份位(包括中位,p50)下的 Latency,实际的QPS 。上图只是报告的一部分,很多明细信息没在图中。

Fortio 的配置方法

首先看配置界面中 Client side 用到的部分:

image-20210603115329507

说明一下重要字段:

  • 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 也可以是基于拓扑关系的:

image-20210603151947141

fortio sever 通过命令行可以建立一个转发拓扑,如上图中的 Fortio(Level 1)用以下命令参数启动:

1
fortio server -M "8070 http://fortio-server-l2-1:8080 http://fortio-server-l2-2:8080"

结语

本文不是个完整的 fortio 介绍。完整的介绍还是看官网 fortio (https://fortio.org/) 。和其它类似的工具比较有其优点:

  • 是 Istio 官方御用
  • golang 的实现,传说中的高性能(虽然我一直认为这个论调太 naive)
  • URL 中指定 latency 和 http status code
  • 可定制拓扑关系

当需要知道我们自己的 Istio Mesh 的性能时,benchmark 是一个很好的方法(之一)。

Keep Benchmarking, Keep Sweeping !

image-20210602103540586

分享

Mark Zhu
作者
Mark Zhu
An old developer