当前位置: 首页 > news >正文

这2个性能压测及可视化监控工具,小众但好用!

在api上线之前,我们需要知道API的性能,以便能够了解到API服务器能够承载的最大请求量,性能瓶颈,然后根据业务的要求,对api进行性能调优与扩缩容。

用来衡量API性能的指标主要有3个

  • 并发数(concurrent):在某个时间段内,同时请求同一个API的用户个数。

  • 每秒查询数(QPS):QPS是一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。QPS = 并发数 / 平均请求响应时间

  • 请求响应时间(TTLB):客户端发起请求到得到响应的整个时间。

这三者之中,最重要的是QPS,但是在说明QPS的时候,需要指定是多少并发数下的QPS,否则意义不大。在QPS相同的情况下,并发数越大说明API性能越好,并发处理能力越强。

有很多web性能测试工具,常用的有 Jmeter、AB、Webbench 和 wrk。这里我们使用wrk作为性能测试工具,gnuplot工具来将测试数据以图表的形式展示。

我们以最简单的echo服务器为例来进行性能测试

  1. package main

  2. import (

  3. "log"

  4. "net/http"

  5. )

  6. func main() {

  7. http.HandleFunc("/echo", echo)

  8. log.Fatal(http.ListenAndServe(":8080", nil))

  9. }

  10. func echo(w http.ResponseWriter, r *http.Request) {

  11. q := r.URL.RawQuery

  12. w.Write([]byte(q))

  13. }

wrk使用

首先需要安装wrk

  1. # 下载源码

  2. git clone https://github.com/wg/wrk

  3. cd wrk

  4. # 编译

  5. make

  6. # 可执行文件移动到bin目录下

  7. cp ./wrk /usr/local/bin/

wrk的使用并不复杂,参数也并不多,输入wrk命令就可以看到所有的参数了​​​​​​​

  1. $ wrk

  2. Usage: wrk <options> <url>

  3. Options:

  4. -c, --connections <N> Connections to keep open

  5. -d, --duration <T> Duration of test

  6. -t, --threads <N> Number of threads to use

  7. -s, --script <S> Load Lua script file

  8. -H, --header <H> Add header to request

  9. --latency Print latency statistics

  10. --timeout <T> Socket/request timeout

  11. -v, --version Print version details

  12. Numeric arguments may include a SI unit (1k, 1M, 1G)

  13. Time arguments may include a time unit (2s, 2m, 2h)

参数说明:

  • -c:并发数

  • -d:测试的持续时间,默认为10s

  • -t:线程数。(不要太多,为核数的2到4倍即可,太多反而会因为切换过于频繁而降低效率)

  • -T:请求超时时间

  • -H:指定请求的http header。

  • --latency:打印响应时间分布

  • -s:指定lua脚本

启动echo服务程序,执行下面的命令来进行性能测试

  1. wrk -t8 -c10000 -d20s -T20s --latency http://localhost:8080/echo?hello

  2. Running 20s test @ http://localhost:8080/echo?hello

  3. 8 threads and 10000 connections

  4. Thread Stats Avg Stdev Max +/- Stdev

  5. Latency 54.00ms 36.72ms 530.63ms 76.74%

  6. Req/Sec 23.94k 4.89k 39.35k 67.50%

  7. Latency Distribution

  8. 50% 50.78ms

  9. 75% 62.96ms

  10. 90% 90.13ms

  11. 99% 198.25ms

  12. 3789262 requests in 20.09s, 437.26MB read

  13. Requests/sec: 188579.15

  14. Transfer/sec: 21.76MB

用8个线程模拟10000个连接,持续20s进行测试。对于测试的结果,我们需要了解其含义。

  • Thread Stats是线程统计,包括Latency和Req/Sec两部分。

  • Latency:响应时间。有平均值,标准差,最大值,正负偏差在一个标准差范围内的占比。

  • Req/Sec:每个线程每秒完成的请求数,同样有上面的四个值。

  • Latency Distribution响应时间分布

  • 50%:50%的请求响应时间不超过50.78ms

  • 75%:75%的请求响应时间不超过62.96ms

  • 90%:90%的请求响应时间不超过90.13ms

  • 99%:99%的请求响应时间不超过198.25ms

  • 789262 requests in 20.09s, 437.26MB read:表示在20.09s内完成的总请求数为3789262,数据读取量为437.26MB

  • Requests/sec:QPS

  • Transfer/sec:平均每秒读取的数据量(吞吐量)

如果我们将模拟的并发数调大一些,可能还会看到一组数据Socket errors: connect 21774, read 0, write 0, timeout 0:错误统计。包括连接失败请求个数,读失败请求个数,写失败请求个数,超时请求个数。

数据可视化

了解了wrk工具的使用,我们就可以不断调整并发数,然后执行wrk测试命令,将测试的结果使用awk提取出我们想要的指标,比如前文提到的并发数,QPS、TTLB等,然后输出到数据文件当中。

使用gnuplot来从数据文件中获取数据并绘制成图片。

首先,我们安装gnuplot工具

$ sudo yum -y install gnuplot

然后我们编写脚本来完成性能测试的数据收集以及图片的绘制。

先完成整体的框架

  1. # wrk性能测试所用参数

  2. duration="20s"

  3. concurrent="200 500 1000 3000 5000 10000 15000 20000 25000 50000"

  4. threads=$((2 * `grep -c processor /proc/cpuinfo`))

  5. cmd="wrk -t${threads} -d${duration} -T30s --latency"

  6. wrkdir="./wrk"

  7. mkdir -p ${wrkdir}

  8. # 生成的文件名

  9. qpsttlb="echo_qps_ttlb.png"

  10. successrate="echo_successrate.png"

  11. datfile="echo.dat"

  12. # 性能测试流程

  13. for c in ${concurrent}

  14. do

  15. wrkcmd="${cmd} -c ${c} $1"

  16. echo "Running wrk command: ${wrkcmd}"

  17. result=`eval ${wrkcmd}` # 执行性能测试命令并获取结果

  18. convert_plot_data "${result}" # 从结果中提取数据并保存为数据文件

  19. done

  20. plot &> /dev/null #根据数据文件绘制出图片

剩下就是两个函数了,首先是负责生成数据文件的convert_plot_data函数​​​​​​​

  1. function convert_plot_data()

  2. {

  3. # 传入wrk性能测试的执行结果,提取出需要的信息,写入文件当中

  4. echo "$1" | awk -v datfile="${wrkdir}/${datfile}" ' {

  5. if ($0 ~ "Running") {

  6. common_time=$2

  7. }

  8. if ($0 ~ "connections") {

  9. connections=$4

  10. common_threads=$1

  11. }

  12. if ($0 ~ "Latency ") {

  13. avg_latency=convertLatency($2)

  14. }

  15. if ($0 ~ "50%") {

  16. p50=convertLatency($2)

  17. }

  18. if ($0 ~ "75%") {

  19. p75=convertLatency($2)

  20. }

  21. if ($0 ~ "90%") {

  22. p90=convertLatency($2)

  23. }

  24. if ($0 ~ "99%") {

  25. p99=convertLatency($2)

  26. }

  27. if ($0 ~ "Requests/sec") {

  28. qps=$2

  29. }

  30. if ($0 ~ "requests in") {

  31. allrequest=$1

  32. }

  33. if ($0 ~ "Socket errors") {

  34. err=$4+$6+$8+$10

  35. }

  36. }

  37. END {

  38. rate=sprintf("%.2f", (allrequest-err)*100/allrequest)

  39. print connections,qps,avg_latency,rate >> datfile

  40. }

  41. function convertLatency(s) {

  42. if (s ~ "us") {

  43. sub("us", "", s)

  44. return s/1000

  45. }

  46. if (s ~ "ms") {

  47. sub("ms", "", s)

  48. return s

  49. }

  50. if (s ~ "s") {

  51. sub("s", "", s)

  52. return s * 1000

  53. }

  54. }'

  55. }

可以看到在print connections,qps,avg_latency,rate >> datfile中将指标写入数据文件。

另外一个就是负责绘图的plot函数了​​​​​​​

  1. function plot() {

  2. gnuplot << EOF

  3. set terminal png enhanced #输出格式为png文件

  4. set ylabel 'QPS'

  5. set xlabel 'Concurrent'

  6. set y2label 'Average Latency (ms)'

  7. set key top left vertical noreverse spacing 1.2 box

  8. set tics out nomirror

  9. set border 3 front

  10. set style line 1 linecolor rgb '#00ff00' linewidth 2 linetype 3 pointtype 2

  11. set style line 2 linecolor rgb '#ff0000' linewidth 1 linetype 3 pointtype 2

  12. set style data linespoints

  13. set grid #显示网格

  14. set xtics nomirror rotate #by 90#只需要一个x轴

  15. set mxtics 5

  16. set mytics 5 #可以增加分刻度

  17. set ytics nomirror

  18. set y2tics

  19. set autoscale y

  20. set autoscale y2

  21. set output "${wrkdir}/${qpsttlb}" #指定数据文件名称

  22. set title "QPS & TTLB\nRunning: ${duration}\nThreads: ${threads}"

  23. plot "${wrkdir}/${datfile}" using 2:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE0000" axis x1y1 t "QPS","${wrkdir}/${datfile}" using 3:xticlabels(1) w lp pt 5 ps 1 lc rgbcolor "#0000CD" axis x2y2 t "Avg Latency (ms)"

  24. unset y2tics

  25. unset y2label

  26. set ylabel 'Success Rate'

  27. set ytics nomirror

  28. set yrange[0:100]

  29. set output "${wrkdir}/${successrate}" #指定数据文件名称

  30. set title "Success Rate\nRunning: ${duration}\nThreads: ${threads}"

  31. plot "${wrkdir}/${datfile}" using 4:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#F62817" t "Success Rate"

  32. EOF

  33. }

有关gnuplot的使用这里就不过多介绍了,后续可能会专门开启一章进行学习,上面的内容虽然看着复杂,但是总体上就是两个部分:

  • 1.设置图片坐标轴的基本信息,以及样式

  • 2.从数据文件中取出数据绘制成图并保存

这样就可以容易理解上面的内容了。

最终我们可以获得使用性能测试数据绘制成的图片,较为完整地完成了一次性能测试

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

http://www.cnnetsun.cn/news/151461.html

相关文章:

  • Open-AutoGLM vs 竞品:谁才是长链路AI任务处理的真正王者?
  • Web安全测试
  • 当AI实现想法易如反掌时,洞见真正的需求成为关键——某知名密码分析工具的用户反馈挖掘
  • 【干货收藏】企业AI架构实战指南:从框架搭建到场景落地的底层逻辑
  • 收藏这份2025AI高薪指南!大厂抢人大战开启,小白程序员学习大模型正当时
  • 13、FPGA更新与可编程性:安全与应用解析
  • 18、多核心可重构嵌入式系统的安全设计与实现
  • 双非本科生的AI行业逆袭之路:我的经验与心得分享!
  • 运维岗位这么多,你适合哪一个
  • 基于微信小程序的在线家庭娱乐系统毕业设计源码
  • 为什么90%的企业用不好Open-AutoGLM?:硬件选型不当成最大瓶颈(附行业适配白皮书)
  • 模型体积缩小80%仍保持95%精度?Open-AutoGLM量化策略深度拆解
  • 2026年AI产品经理终极学习路线:传统产品经理的转型指南,超详细攻略,不容错过!
  • 【AI Agent可靠性突围】:Open-AutoGLM 7类错误恢复方案实测数据曝光
  • FaceFusion如何优化夜间低光环境下的人脸处理?
  • Open-AutoGLM接入成本大曝光:4个维度评估你的适配级别
  • Open-AutoGLM接口开放度实测:8项关键指标评分,你的项目适合接入吗?
  • 主流AutoGLM框架错误恢复能力对比,哪个真正提升任务成功率?
  • 【AI框架二次开发新标杆】:Open-AutoGLM 4大可扩展性设计,为何被头部企业争相采用?
  • FaceFusion镜像每日下载量突破5000次
  • 从零基础转行渗透测试到如今20k,我经历了什么?
  • 土木人“提桶跑路”零基础转行网络安全,成功实现月入过万
  • HGDB如何提升批量导入数据的速度
  • 11、加勒比与北美地区房地产投资指南
  • 42、太赫兹通信与可见光通信:5G 及未来的前沿技术
  • 46、5G及未来通信中的协同网络技术解析
  • 47、协同网络:过去、现在与未来
  • 50、5G及未来的灵活认知无线电接入技术与频谱感知
  • 58、5G及未来的物理层安全设计
  • 文献综述期末项目的撰写方法与实践研究