news 2026/4/15 10:50:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
这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.从数据文件中取出数据绘制成图并保存

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

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

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 20:28:49

域名交易中常见骗局揭秘,新手一定要警惕这几种套路

随着互联网的发展&#xff0c;域名逐渐成为一种具有价值的数字资产&#xff0c;参与域名交易的人也越来越多。但与此同时&#xff0c;围绕域名交易的各类骗局也不断出现&#xff0c;尤其是新手用户&#xff0c;更容易因为经验不足而遭受损失。提前了解常见套路&#xff0c;是安…

作者头像 李华
网站建设 2026/4/14 20:29:10

FaceFusion人脸融合在智能安防仿真测试中的应用

FaceFusion人脸融合在智能安防仿真测试中的应用 在城市地铁站的监控中心&#xff0c;安全团队正试图验证新部署的人脸识别系统对通缉人员的捕捉能力。然而&#xff0c;真实案件影像稀少且涉及隐私&#xff0c;无法用于大规模压力测试。于是&#xff0c;工程师上传了10张嫌疑人照…

作者头像 李华
网站建设 2026/4/14 17:17:14

FaceFusion在文化遗产数字化保护中的应用探索

FaceFusion在文化遗产数字化保护中的应用探索 在敦煌莫高窟幽深的洞窟中&#xff0c;一尊千年壁画上的菩萨低眉含笑&#xff0c;颜料斑驳、轮廓模糊。千年来&#xff0c;人们只能凭想象揣摩其神态。如今&#xff0c;借助人工智能技术&#xff0c;这尊静止的画像正被赋予呼吸与表…

作者头像 李华
网站建设 2026/4/14 20:29:10

Qoder 自定义指令功能上线!对话框输入 /,即可快速调用指令

自定义指令功能允许开发者将常用的提示词 (Prompts) 和工作流封装为可复用的命令。只需在 Agent 对话框中输入 ​​/​​&#xff0c;即可快速调用这些指令&#xff0c;显著提升日常开发效率。 无论你是频繁执行代码审查、生成测试用例&#xff0c;还是需要快速查询项目规范&a…

作者头像 李华
网站建设 2026/4/14 20:28:50

FaceFusion在虚拟试妆平台中的集成实践

FaceFusion在虚拟试妆平台中的集成实践 在美妆电商与个性化服务快速演进的今天&#xff0c;用户早已不满足于“看图购物”。他们希望看到自己的脸涂上那支网红口红是什么效果&#xff0c;想预览十年后的自己是否适合某款抗老精华。这种对“真实感”和“即时反馈”的追求&#x…

作者头像 李华
网站建设 2026/4/11 23:12:33

制造业大模型落地新思维:从“AI+“到“+AI“的实战指南!

简介 本文探讨制造业从"AI“到”AI"的转变&#xff0c;强调AI应成为融入流程与决策的基础设施&#xff0c;而非外挂工具。生成式AI通过改变认知方式&#xff0c;成为业务与技术间的"连接器"&#xff0c;推动业务流程、知识资产和决策机制的AI化。落地路径需…

作者头像 李华