news 2026/5/26 5:14:03

这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/5/25 15:53:02

FaceFusion人脸替换可用于文化遗产活化再现

FaceFusion人脸替换可用于文化遗产活化再现 在敦煌莫高窟的一幅唐代壁画前&#xff0c;一位游客举起手机扫描二维码——刹那间&#xff0c;画中身着华服的供养人缓缓转头&#xff0c;微笑着开口讲述千年前开凿石窟的故事。这不是科幻电影场景&#xff0c;而是借助AI技术正在实现…

作者头像 李华
网站建设 2026/5/25 6:01:12

出售前如何擦除iPhone数据?9个技巧与3种简单解决方案

iPhone的使用寿命很长&#xff0c;如果保养得当&#xff0c;通常可达10年。但由于苹果频繁更新设备&#xff0c;大多数用户每3年就会通过出售旧设备来升级。然而&#xff0c;在出售之前&#xff0c;采取一些步骤以避免潜在问题是非常重要的。本文将介绍如何在出售前擦除iPhone数…

作者头像 李华
网站建设 2026/5/25 5:58:38

收藏!35岁程序员转型大模型全攻略:凭技术积淀破局,平稳衔接新赛道

35岁&#xff0c;是程序员职业道路上的一道“分水岭”——传统开发岗位的年龄限制、重复劳动的职业倦怠、技术迭代的焦虑感&#xff0c;让不少人陷入“转型无门、坚守乏力”的困境。而大模型浪潮的席卷&#xff0c;恰好为有多年技术积淀的程序员打开了新天窗&#xff1a;你的编…

作者头像 李华
网站建设 2026/5/25 6:55:54

【Python新手村】字典(Dict):别再大海捞针,我有专属“标签”!

哈喽&#xff0c;各位 Python 练习生&#xff01;在前面的旅程里&#xff0c;我们见识过了列表、元组和集合。今天我们要聊的这位&#xff0c;是 Python 里的“情报局局长”——字典 (Dictionary)。想象一下&#xff0c;如果你在列表里存了 1000 个人的信息&#xff0c;想找“张…

作者头像 李华
网站建设 2026/5/25 6:55:55

【技术教程】Node.js 包管理工具全面对比:npm、npx、pnpm 与 cnpm

Node.js 包管理工具全面对比&#xff1a;npm、npx、pnpm 与 cnpm 以下是对 Node.js 生态中常用包管理工具 npm、npx、pnpm 和 cnpm 的全面对比分析&#xff08;基于 2025 年现状&#xff09;。内容涵盖定义、核心理念、使用场景、优劣势对比以及具体使用示例。 1. 定义npm&…

作者头像 李华
网站建设 2026/5/25 6:55:14

咕咕番官网入口 - 免费新番老番动漫在线观看网站

咕咕番&#xff08;Gugufan&#xff09;是一个专门为二次元爱好者打造的综合性动漫内容互动平台。它不仅仅局限于传统的番剧播放&#xff0c;更侧重于通过深度解说、专业点评以及趣味互动来丰富用户的追番体验。该平台旨在解决用户“番荒”的痛点&#xff0c;通过精选的优质内容…

作者头像 李华