写点什么

go 语言实现 web 性能压测工具

用户头像
任小龙
关注
发布于: 2020 年 07 月 17 日



输入参数:URL,请求总次数,并发数

package main
import (
"fmt"
"net/http"
"os"
"sort"
"strconv"
"sync"
"time"
)
type resData struct {
duration float32
status int
}
var wg sync.WaitGroup
func res(url string, ch chan<-resData) {
var status int
startTime := time.Now().UnixNano()
timeout := time.Duration(time.Second)
client := http.Client{
Timeout: timeout,
}
reqData, err := client.Get(url)
duration := float32(time.Now().UnixNano()-startTime) / 1000000
if err != nil{
status = 0
} else {
status = reqData.StatusCode
_ = reqData.Body.Close()
}
ch <- resData{
duration: duration,
status: status,
}
wg.Done()
}
func main() {
startTime := time.Now().UnixNano()
args := os.Args[1:]
if len(args) < 3 {
fmt.Println("参数不足,eg:https://www.baidu.com/ 100 10")
return
}
url := args[0]
reqTotalNum, err := strconv.Atoi(args[1])//请求总次数
if err != nil {
fmt.Println("请求总次数(第二个)参数错误,应该是整数")
return
}
concurrentNum, err := strconv.Atoi(args[2])//并发数
if err != nil {
fmt.Println("并发数(第三个)参数错误,应该是整数")
return
}
if reqTotalNum%concurrentNum!=0 {
fmt.Println("并发数与请求次数应该是倍数关系")
return
}
times:=reqTotalNum/concurrentNum
resChan := make(chan resData, reqTotalNum)
for j := 0; j < times; j++ {
for i := 0; i < concurrentNum; i++ {
wg.Add(1)
go res(url, resChan)
}
wg.Wait()
fmt.Println("第",j,"次并发请求",len(resChan))
}
close(resChan)
calAndExport(resChan)
fmt.Println("本次执行时间:",float32(time.Now().UnixNano()-startTime) / 1000000,"毫秒")
}
func calAndExport(ch chan resData){
fmt.Println("管道内元素数量",len(ch))
var sum, resRate float32
var count = 0
var res95 []float64
var wrongNum int
for v := range ch {
if v.status == 200 {
sum += v.duration
count++
res95 = append(res95, float64(v.duration))
} else {
wrongNum++
//fmt.Println(v)
}
}
avg := sum / float32(count)
sort.Float64s(res95)
key := int(float32(len(res95)) * 0.95)
if res95 != nil {
resRate = float32(res95[key])
} else {
resRate = float32(0)
}
fmt.Println("平均响应时间:",avg)
fmt.Println("95%响应时间:",resRate)
fmt.Println("异常返回次数:",wrongNum)
}

以下是以百度首页为目标进行压测的结果

命令如下

go run main.go https://www.baidu.com/ 100 10

结果集

第 0 次并发请求 10
第 1 次并发请求 20
第 2 次并发请求 30
第 3 次并发请求 40
第 4 次并发请求 50
第 5 次并发请求 60
第 6 次并发请求 70
第 7 次并发请求 80
第 8 次并发请求 90
第 9 次并发请求 100
管道内元素数量 100
平均响应时间: 99.78408
95%响应时间: 376.387
异常返回次数: 1
本次执行时间: 2008.433 毫秒

为什么正文不少于50个字

发布于: 2020 年 07 月 17 日阅读数: 74
用户头像

任小龙

关注

还未添加个人签名 2019.02.11 加入

还未添加个人简介

评论

发布
暂无评论
go语言实现web性能压测工具