先安装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系统。