这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服务器为例来进行性能测试

package main
 
import (
  "log"
  "net/http"
)
 
func main() {
  http.HandleFunc("/echo", echo)
  log.Fatal(http.ListenAndServe(":8080", nil))
}
 
func echo(w http.ResponseWriter, r *http.Request) {
  q := r.URL.RawQuery
  w.Write([]byte(q))
}

wrk使用 

首先需要安装wrk

# 下载源码
git clone https://github.com/wg/wrk
cd wrk
# 编译
make
# 可执行文件移动到bin目录下
cp ./wrk /usr/local/bin/

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

 
$ wrk
Usage: wrk <options> <url>
  Options:
    -c, --connections <N>  Connections to keep open
    -d, --duration    <T>  Duration of test
    -t, --threads     <N>  Number of threads to use
 
    -s, --script      <S>  Load Lua script file
    -H, --header      <H>  Add header to request
        --latency          Print latency statistics
        --timeout     <T>  Socket/request timeout
    -v, --version          Print version details
 
  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)

参数说明:

  • -c:并发数

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

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

  • -T:请求超时时间

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

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

  • -s:指定lua脚本

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

 wrk -t8 -c10000 -d20s -T20s --latency http://localhost:8080/echo?hello
Running 20s test @ http://localhost:8080/echo?hello
  8 threads and 10000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    54.00ms   36.72ms 530.63ms   76.74%
    Req/Sec    23.94k     4.89k   39.35k    67.50%
  Latency Distribution
     50%   50.78ms
     75%   62.96ms
     90%   90.13ms
     99%  198.25ms
  3789262 requests in 20.09s, 437.26MB read
Requests/sec: 188579.15
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

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

先完成整体的框架

# wrk性能测试所用参数
duration="20s"
concurrent="200 500 1000 3000 5000 10000 15000 20000 25000 50000"
threads=$((2 * `grep -c processor /proc/cpuinfo`))
cmd="wrk -t${threads} -d${duration} -T30s --latency"
 
wrkdir="./wrk"
mkdir -p ${wrkdir}
 
# 生成的文件名
qpsttlb="echo_qps_ttlb.png"
successrate="echo_successrate.png"
datfile="echo.dat"
 
# 性能测试流程
for c in ${concurrent}
do
    wrkcmd="${cmd} -c ${c} $1"
    echo "Running wrk command: ${wrkcmd}"
    result=`eval ${wrkcmd}` # 执行性能测试命令并获取结果
    convert_plot_data "${result}" # 从结果中提取数据并保存为数据文件
done
plot &> /dev/null #根据数据文件绘制出图片

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

function convert_plot_data()
{
    # 传入wrk性能测试的执行结果,提取出需要的信息,写入文件当中
  echo "$1" | awk -v datfile="${wrkdir}/${datfile}" ' {
  if ($0 ~ "Running") {
    common_time=$2
  }
if ($0 ~ "connections") {
  connections=$4
  common_threads=$1
}
if ($0 ~ "Latency   ") {
  avg_latency=convertLatency($2)
}
if ($0 ~ "50%") {
  p50=convertLatency($2)
}
if ($0 ~ "75%") {
  p75=convertLatency($2)
}
if ($0 ~ "90%") {
  p90=convertLatency($2)
}
if ($0 ~ "99%") {
  p99=convertLatency($2)
}
if ($0 ~ "Requests/sec") {
  qps=$2
}
if ($0 ~ "requests in") {
  allrequest=$1
}
if ($0 ~ "Socket errors") {
  err=$4+$6+$8+$10
}
}
END {
rate=sprintf("%.2f", (allrequest-err)*100/allrequest)
print connections,qps,avg_latency,rate >> datfile
}
function convertLatency(s) {
  if (s ~ "us") {
    sub("us", "", s)
    return s/1000
  }
if (s ~ "ms") {
  sub("ms", "", s)
  return s
}
if (s ~ "s") {
  sub("s", "", s)
  return s * 1000
}
}'
}

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

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

function plot() {
  gnuplot <<  EOF
set terminal png enhanced #输出格式为png文件
set ylabel 'QPS'
set xlabel 'Concurrent'
set y2label 'Average Latency (ms)'
set key top left vertical noreverse spacing 1.2 box
set tics out nomirror
set border 3 front
set style line 1 linecolor rgb '#00ff00' linewidth 2 linetype 3 pointtype 2
set style line 2 linecolor rgb '#ff0000' linewidth 1 linetype 3 pointtype 2
set style data linespoints
set grid #显示网格
set xtics nomirror rotate #by 90#只需要一个x轴
set mxtics 5
set mytics 5 #可以增加分刻度
set ytics nomirror
set y2tics
set autoscale  y
set autoscale y2
set output "${wrkdir}/${qpsttlb}"  #指定数据文件名称
set title "QPS & TTLB\nRunning: ${duration}\nThreads: ${threads}"
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)"
unset y2tics
unset y2label
set ylabel 'Success Rate'
set ytics nomirror
set yrange[0:100]
set output "${wrkdir}/${successrate}"  #指定数据文件名称
set title "Success Rate\nRunning: ${duration}\nThreads: ${threads}"
plot "${wrkdir}/${datfile}" using 4:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#F62817" t "Success Rate"
EOF
}
有关gnuplot的使用这里就不过多介绍了,后续可能会专门开启一章进行学习,上面的内容虽然看着复杂,但是总体上就是两个部分:
  • 1.设置图片坐标轴的基本信息,以及样式

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

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

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

 

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

在这里插入图片描述


软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值