API压测笔记
API的压力测试是业务上线前的重要环节,也是对系统性能的一个量化测量,对实际业务诸方面都有重要的参考价值。
这里主要说说API压测的方法和常用手段。
压测方法
- go benchmark
如果是golang后端,可以直接手写测试用例,然后使用go工具链自带的benchmark进行压测。
- ApacheBench
ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。
安装apache2-utils
即可在系统上使用ab
命令。
作为演示,使用ab测试一个GET接口:
1 | ab -n 2000 -c 1200 "http://127.0.0.1:9999/get_result?a=10&b=20" |
n: 测试轮次
c: 客户端数量
T: 内容类型
p: 包含post参数的文件
引号是必须的
wrk
一个C编写的API压测工具
1 | 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格式的二维数组。
测试指令:
1 | wrk -t 20 -c 10000 -d 180s -s bench.lua --latency "http://localhost:8080/api/calc/mul" |
测试结果如下:
1 | xeonds@ark-station:~/code/vec-calculator-server$ make bench |
测试平台是Intel Core i7-12700H
,可以看到并发在1,0000
的时候,Gin的性能还是不错的,TPS保持在了19万的水准。
碎碎念
该说不该说呢,以前我认为语言就是由语法和编译器/解释器构成,但是Golang这样从语法上支持一个feature的行为让我疑惑:语言的标准库该不该算是语言特性的一部分?
go
这个关键字作为一个大大的语法糖,似乎在打破语言的库和语言本身的分界线。我也无从知晓这一方向的尽头是什么。