Day 14:Load testing

虽然在昨天有说到今天希望可以改善 dashboard,然而我在做到一半的时候突然惊觉...现在根本就没有多少资料可以给我画图表。但是在这种情况下,如果我每次都要手动去发一些请求的话未免也太花费人力了,既然都打算要发一堆请求了,那麽今天就来谈谈 load testing 吧。

为何需要做 load testing

记得在 Day 6 的时候我有提过,做监控的其中一个目的是要做容量规划,这样我们好进行成本的控管,然而我们不能指望透过真实使用者的流量来进行规划,因为假设当我们今天上了一个新的版本,可是却没有办法承受现有的流量的时候,那麽就有可能造成服务的不稳定。

综上所述,我们应该要在新的版本被部署下去之前,先模拟出预期的流量,来判断在这种程度的流量下,服务到底有没有办法达到我们预期的效能。当然这些测试也最好整合到我们的 CI 流程里面,省去手动测试的麻烦。

使用 Drill 执行 load testing

那麽,今天我打算尝试的工具是 Drill,他可以透过类似 Ansible 的语法去定义 load testing 的内容。而且有另外一点,他是用 Rust 写的,不知为何我对 Rust 有莫名的好感,所以才想试试看 Drill 这个工具。顺带一提,有另外一款也是用 Rust 开发的 load testing 工具 goose,甚至可以用 Rust 定义测试内容,希望哪天也能尝试看看。

建立 Docker image

那麽首先第一步,当然是先建一个 Docker image 啦,因为 Drill 现在并没有官方维护的 image,所以这边就借一下舰长大大之前在某篇介绍 Drill 的文章里面所使用的 Dockerfile 吧(我有稍微修改一下)。

FROM rust:1.53
RUN apt-get update && \
    apt-get install -y curl libssl-dev pkg-config && \
    rm -rf /var/lib/apt/lists/*
RUN cargo install drill
ENTRYPOINT drill

然後下 docker build -t drill . 之後,就有个 Drill 的 Docker image 可以用了。

benchmark 设定

接下来就要处理设定测试内容了,首先先简单的发几次 request 给首页吧。下面的设定意思是说,对於 http://caddy:8080/ 这个 URL 去发 12 请求,并行数量为 4。

base: "http://caddy:8080"
iterations: 12
concurrency: 4

plan:
  - name: Test URL | Home
    request:
      url: /

然後透过以下指令执行,因为我是在 WSL 上面跑没有办法挂 host network,所以就跟 NOJ 放同个 bridge network 底下。

docker run --rm \
  -v $PWD:/drill \
  -w /drill \
  --network normal-oj_default \
  drill -s --benchmark benchmark.yml

执行结果,看起来一切正常。

接下来就要撰写比较复杂的设定了,目前希望可以做到的操作是要模拟一下同学浏览题目的流程,最後的成果会类似这样。

base: "http://caddy:8080"
iterations: 5000
concurrency: 50

plan:
  - name: View homepage
    request:
      url: /
  - name: Login
    request:
      url: /api/auth/session
      method: POST
      headers:
        Content-Type: application/json
      body: '{"username": "first_admin", "password": "firstpasswordforadmin"}'
  - name: Get course
    request:
      url: /course
  - name: View "Public"
    request:
      url: /course/Public
  - name: View problems
    request:
      url: /course/Public/problems
  - name: View problem 1
    request:
      url: /problem/1

执行之後看看统计数据。

再回到 Grafana 的 dashboard,可以看到有比较多数据可以绘制图表了。

小结

今天简单尝试了一下 Drill,感觉挺不错的,记得之前看过有人抱怨他能够产生的压力其实比起其他工具来说低了不少,但我目前没有感受到明显的差别,甚至觉得他还挺快的。另外他现在也支援了越来越丰富的功能,对於不需要复杂逻辑的测试,我想应该算是绰绰有余,而且写起来很快,透过 yml 档就能快速定义,推荐有需要的大家也能试试。

另外上面的设定我想其实并不适合应用在实际的测试中,因为这边并没有好好定义预期的回应时间等指标,所以也就无从判断测试是成功还是失败。


<<:  Day13:终於要进去新手村了-Javascript-判断式基本结构-if…else

>>:  Day 13 : 案例分享(4.2) 签核与费用模组 - 签核模组 Base Tier Validation

PHP 正则相关函数

PHP Regular expression 本来 PHP 支援两类 regular express...

[ Day 37 ] - 在 Github Release 上发布我们的安装档

之前本鲁都将打包出来的安装档 , 放到 git 中上传到 github 中 来产生一个公开连结让邦友...

D-19 网页站台 ? webapp ? mvc ? webapi

网页站台初体验 在昨日最後大头跟小光说c#的介绍告一段落了,所以今天开始会进入网页站台相关知识的介绍...

ViewModel 中的 UI 状态 - 以 Selection state 为例

在一个应用程序中,有着各种不同类型的资料,这些不同的资料也有属於他们的生命周期,有些资料就像之前介绍...

处理 API 层次感之地基篇

先重新封装 axios 的用法。并且一开始先不打算开放使用 axios 原生功能。 希望可以让 GE...