API压测笔记

xeonds

2024-03-18 22:41:07

API的压力测试是业务上线前的重要环节,也是对系统性能的一个量化测量,对实际业务诸方面都有重要的参考价值。

这里主要说说API压测的方法和常用手段。

压测方法

如果是golang后端,可以直接手写测试用例,然后使用go工具链自带的benchmark进行压测。

ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。

安装apache2-utils即可在系统上使用ab命令。

作为演示,使用ab测试一个GET接口:

ab -n 2000 -c 1200  "http://127.0.0.1:9999/get_result?a=10&b=20"

一个C编写的API压测工具

wrk -t10 -c100 -d10s http://localhost:8080/api/users    # 使用10个线程,100并发数,测试持续10s

开测

我最后还是选了wrk做压测因为ab装不上

测试接口是POST http://localhost:8080/api/calc/mul,payload是一个2*n的json格式的二维数组。

测试指令:

wrk -t 20 -c 10000 -d 180s -s bench.lua --latency "http://localhost:8080/api/calc/mul"

## bench.lua
wrk.method = "POST"
wrk.body = "[[1,2,3,1],[4,5,7,8]]"
wrk.headers['Content-Type'] = "application/json"

测试结果如下:

xeonds@ark-station:~/code/vec-calculator-server$ make bench 
cd build && ./vec-calc-web-linux-amd64-1.0.0 & sleep 1 && \
wrk -t 20 -c 10000 -d 180s -s bench.lua --latency "http://localhost:8080/api/calc/mul"
Running 3m test @ http://localhost:8080/api/calc/mul
  20 threads and 10000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    61.27ms   62.15ms   1.46s    93.06%
    Req/Sec     9.74k     1.33k   22.11k    71.75%
  Latency Distribution
     50%   48.47ms
     75%   66.32ms
     90%   90.10ms
     99%  364.05ms
  34884275 requests in 3.00m, 4.35GB read
Requests/sec: 193693.29
Transfer/sec:     24.75MB

测试平台是Intel Core i7-12700H,可以看到并发在1,0000的时候,Gin的性能还是不错的,TPS保持在了19万的水准。

碎碎念

该说不该说呢,以前我认为语言就是由语法和编译器/解释器构成,但是Golang这样从语法上支持一个feature的行为让我疑惑:语言的标准库该不该算是语言特性的一部分?

go这个关键字作为一个大大的语法糖,似乎在打破语言的库和语言本身的分界线。我也无从知晓这一方向的尽头是什么。

Reference