wrk下载和安装

先安装git

 cd /usr/local/src
yum install git -y  

下载wrk文件

 git clone   
cd wrk  
make    

编译成功后,目录下就会有一个wrk文件。

环境配置信息

CPU:8核心16线程

内存:16G

服务运行平台:windows10 64位

压测服务运行平台:centos6.5

golang测试接口性能指标-带磁盘IO操作

该接口表示获取uploads文件夹更目录下所有文件列表。我们用wrk压测该接口看下性能指标。

 func listHandler(w http.ResponseWriter, r *http.Request) {
exists := isExists("./uploads")
if !exists {
 os .MkdirAll("./uploads", os.ModePerm)
}
fileInfoArr, err := ioutil.ReadDir("./uploads")
if err != nil {
http.Error(w, err.Error(),
http.StatusInternalServerError)
return
}
listHtml := ""
for _, fileInfo := range fileInfoArr {
imgid := fileInfo.Name()
listHtml += "<li><a href=\"/viewPage?id=" + imgid + "\">" + imgid + "</a></li>"
}
pushHtmlString(w, "<a href='/upload'>相册上传</a>"+"<ol>"+listHtml+"</ol>")
}  

压测命令:

 ./wrk -t12 -c400 -d30s   

压测结果:

 [root@vm1 wrk]# ./wrk -t12 -c400 -d30s 
Running 30s test @ 
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   117.79ms   14.15ms 212.55ms   87.51%
    Req/Sec   282.37     92.47   656.00     81.68%
  100822 requests in 30.06s, 21.44MB read
Requests/sec:   3353.87
 Transfer /sec:    730.38KB  
golang测试接口性能指标-常规接口

这是一个普通的接口,向客户端输出html信息即可。

 func upload(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
pushHtmlString(w, "<a href='/all'>相册查看</a>"+"<form method=\"POST\" action=\"/upload\" "+
" enctype=\"multipart/form-data\">"+
"Choose an image to upload: <input name=\"image\" type=\"file\" />"+
"<input type=\"submit\" value=\"Upload\" />"+
"</form>")
return
}
}  

压测结果:

 [root@vm1 wrk]# ./wrk -t12 -c400 -d30s 
Running 30s test @ 
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    23.58ms   15.25ms 308.32ms   93.15%
    Req/Sec     1.51k   349.33    10.53k    80.72%
  535748 requests in 30.10s, 164.52MB read
Requests/sec:  17797.87
Transfer/sec:      5.47MB  
测试总结

在当前运行环境下,golang编写的一个常规web接口,QPS为17797.87。由于压测服务器是vmware虚拟机里,有性能损耗。

按参考教程里测试结果显示,多次测试的结果在 4 万左右的 QPS 浮动,响应时间最多也就是 40ms 左右,对于⼀个 Web 程序来说,这已经是很不错的成绩了,我们只是照抄了别⼈的示例代码,就完成了⼀个⾼性能的 hello world 服务器。

笔记总结
 package main

import "fmt"

/**
golang接口性能测试
压测工具 wrk。参考教程:


性能指标:
TPS:Transactions Per Second  写接口的性能指标,每秒可以完成的事务数量
QPS: Queries Per Second  查询接口的性能指标,每秒可以完成的查询数量 也叫吞吐量
QoS: Quality of Service       单个接口服务质量

1.普通查询接口QPS获取
./wrk -t12 -c400 -d30s 
[root@vm1 wrk]# ./wrk -t12 -c400 -d30s 
Running 30s test @ 
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   117.79ms   14.15ms 212.55ms   87.51%
    Req/Sec   282.37     92.47   656.00     81.68%
  100822 requests in 30.06s, 21.44MB read
Requests/sec:   3353.87
Transfer/sec:    730.38KB

Requests/sec: x  x就是 qps
2.数据库写接口TPS获取 目前尚未提供该数据库交互接口,应该是post接口。需要配合post. lua 脚本完成
./wrk --latency -t100 -c1500  -d120s --timeout=15s -s post.lua 
Requests/sec: x  x就是 tps qps


wrk补充说明:
wrk可以配合lua脚本,完成各种接口测试,如带文件上传,post请求,form表单提交,随机数等等。通过编程手段完成压测。

*/func main5() {
fmt.Println("注释介绍golang接口性能测试")
}  
问题延伸

任何一个接口都有自己的QPS吞吐量,可以最大程度的去提高这个值,但不会达到无限大,既然总有一个极限值,那就意味着,当请求特别大总会突破这个QPS瓶颈,这时候会发生什么呢?常规默认情况下,服务会降低速度或奔溃,所有访问的用户都会受到影响,访问慢甚至服务不可达。

这时候就引入流量限制服务的概念,超出qps的请求进行合理的处理,保障qps以内的请求是可用的。

比如阿里的开源系统:sentinel 流量控制 ,就是做这个事情的。详细介绍参考:

介绍

golang有自己的第三方库进行流量控制, sentinel流量控制主要服务于java系统。