打压工具

当业务刚刚起步的时候,微服务的稳定性是我们的首要保障目标,即服务能否稳定运行而不会挂掉。

随着业务逐渐发展,用户数据量不断增大,并发的请求数也会不断加大。慢慢地,性能问题也会逐渐暴露出来。

典型的性能问题有:

  1. 服务响应变慢
  2. 并发请求过多,导致数据库连接打满,无法访问数据库
  3. 流量过大,带宽被打满

想要解决性能问题,先要能客观的评价性能,例如:在100个并发用户的前提下,我们的服务每秒能处理多少请求?

要评估这类性能问题,就需要做一些性能压测。

性能打压工具可以大致分为两类:

  1. 在UI界面配置完成打压,如JMeter、Tsung等
  2. 需要写代码完成打压,如Gatling、Locust等

对于JMeter等工具,虽然上手简单,但是可定制程度较低,一些复杂的规则和参数配置起来很繁琐,一般由测试人员做简单打压时使用。而Locust等工具,虽然需要写代码,但了都提供了简化的API,编写起来非常简单,而且可以适应复杂的业务需求。

综上所述,我们选用代码类打压工具。

Gatling性能很好,但只支持Scala语言;Locust是Python语言开发的,可以支持多种编程语言。在本书中,我们将分别介绍这两款打压工具。

暴露服务端口

在介绍打压工具前,我们先要对服务进行一些变更,让服务能够从集群外访问到。

Spring Boot整合REST服务章节中,我们配置了基于Kubernetes的REST服务,并设置了虚拟IP、虚拟IP的8080端口负责多结点的负载均衡。但是,虚拟IP默认只在集群内部生效。

当我们需要将Kubernetes服务暴露给集群外时,一般有如下选择:

  • 为Service添加NodePort
  • 为Service添加ClusterIP
  • 增加Nginx反向代理,并为Nginx添加上述外部暴露的端口

在这里,我们采用第一种方式,如果你想了解其他方式,可以参考Publising Service

看一下更新的service描述文件

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: lmsia-abc-server-service
  5. spec:
  6. selector:
  7. app: lmsia-abc-server
  8. type: NodePort
  9. ports:
  10. - name: http
  11. protocol: TCP
  12. port: 8080
  13. nodePort: 30888
  14. - name: rpc
  15. protocol: TCP
  16. port: 3000
  17. nodePort: 30999

与之前的文件相比,上述yaml描述主要是增加了NodePort的定义和描述。

  • http端口对外暴露的是30888
  • rpc端口对外暴露的是30999

我们应用下配置变更:

  1. kubectl apply -f lmsia-abc-server-service-node-port.yaml

然后尝试访问,可以成功访问:

  1. curl http://192.168.99.100:30888/lmsia-abc/api/
  2. Hello, REST

Locust打压工具

在你的开发机上安装

  1. pip install locustio

下面我们来看打压脚本hello.py:

  1. from locust import HttpLocust, TaskSet, task
  2. import resource
  3. resource.setrlimit(resource.RLIMIT_NOFILE, (999999, 999999))
  4. print resource.getrlimit(resource.RLIMIT_NOFILE)
  5. class TestSet(TaskSet):
  6. @task(1)
  7. def hello(self):
  8. self.client.get("/lmsia-abc/api/")
  9. class WebsiteUser(HttpLocust):
  10. task_set = TestSet
  11. min_wait = 5000
  12. max_wait = 9000

上面的代码非常简单,就是访问地址”/lmsia-abc/api/“。

下面来运行打压工具

  1. locust -f hello.py --host=http://192.168.99.100:30888

启动后,访问localhost:8089,会进入如下界面:

Locust选择用户数

上面是设置最终多少并发,下面是设置用户增长的速度(每秒新增多少)。

我们这里分别设置1000和200,然后点击开始。

之后会进入打压进度页面,如下图所示:

Locust打压进度

点击”Charts”,可以看到随着用户数变化,响应时间、QPS的变化曲线,如下图:

Locust打压变化

打压结束后,点击”STOP”即可。

除了单击打压外,Locust还支持分布式打压,即可以启动若干个节点共同完成打压作业,具体可以参考官方文档Running Locust distributed

Gatling打压工具

首先,到官网下载最新版的gatling:

  1. https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/2.3.1/gatling-charts-highcharts-bundle-2.3.1-bundle.zip

然后解压缩到本地路径:

  1. unzip gatling-charts-highcharts-bundle-2.3.1.zip
  2. mv gatling-charts-highcharts-bundle-2.3.1 gatling

然后看一下打压脚本:

  1. import io.gatling.core.Predef._
  2. import io.gatling.http.Predef._
  3. import scala.concurrent.duration._
  4. class HelloSimulation extends Simulation {
  5. val httpConf = http
  6. .baseURL("http://192.168.99.100:30888")
  7. val scn = scenario("HelloSimulation").during(30) {
  8. exec(http("hello_1")
  9. .get("/lmsia-abc/api/"))
  10. }
  11. setUp(
  12. scn.inject(atOnceUsers(2000))
  13. ).protocols(httpConf)
  14. }

如上,Gating的打压脚本稍微复杂一些:

  • 服务根地址192.168.99.100:30888
  • 访问的get请求”/lmsia-abc/api/“
  • 并发2000个用户

执行一下打压:

  1. gatling.sh -sf . -s HelloSimulation

结果中可以直接看到各项统计结果:

  1. ---- Global Information --------------------------------------------------------
  2. > request count 353505 (OK=353505 KO=0 )
  3. > min response time 0 (OK=0 KO=- )
  4. > max response time 1644 (OK=1644 KO=- )
  5. > mean response time 170 (OK=170 KO=- )
  6. > std deviation 122 (OK=122 KO=- )
  7. > response time 50th percentile 143 (OK=143 KO=- )
  8. > response time 75th percentile 219 (OK=219 KO=- )
  9. > response time 95th percentile 408 (OK=408 KO=- )
  10. > response time 99th percentile 606 (OK=606 KO=- )
  11. > mean requests/sec 11047.031 (OK=11047.031 KO=- )
  12. ---- Response Time Distribution ------------------------------------------------
  13. > t < 800 ms 353348 (100%)
  14. > 800 ms < t < 1200 ms 148 ( 0%)
  15. > t > 1200 ms 9 ( 0%)
  16. > failed 0 ( 0%)
  17. ================================================================================
  18. Reports generated in 2s.

Gating的打压工具功能更为强大,具体可以参考官方教程Gatling UserGuides